首页 文章

ORC文件上的Spark SQL不会返回正确的架构(列名称)

提问于
浏览
3

我有一个包含ORC文件的目录 . 我正在使用以下代码创建一个DataFrame

var data = sqlContext.sql("SELECT * FROM orc.`/directory/containing/orc/files`");

它返回此架构的数据框

[_col0: int, _col1: bigint]

预期架构在哪里

[scan_nbr: int, visit_nbr: bigint]

当我查询镶木地板格式的文件时,我得到了正确的架构 .

我错过了任何配置吗?

Adding more details

这是Hortonworks Distribution HDP 2.4.2(Spark 1.6.1,Hadoop 2.7.1,Hive 1.2.1)

我们没有更改HDP的默认配置,但这绝对不同于Hadoop的普通版本 .

数据由上游Hive作业写入,一个简单的CTAS(CREATE TABLE样本存储为ORC作为SELECT ...) .

我在CTAS使用最新的2.0.0配置单元生成的文件上对此进行了测试,并保留了orc文件中的列名称 .

5 回答

  • 1

    问题是Hive版本,即1.2.1,它有这个bug HIVE-4243

    这是在2.0.0中修复的 .

  • 0

    设置

    sqlContext.setConf('spark.sql.hive.convertMetastoreOrc', 'false')
    

    解决这个问题 .

  • -2

    如果您也有镶木地板版本,您可以只复制列名称,这就是我所做的(同样,日期列是orc的分区键,因此必须将其移动到最后):

    tx = sqlContext.table("tx_parquet")
    df = sqlContext.table("tx_orc")
    tx_cols = tx.schema.names
    tx_cols.remove('started_at_date')
    tx_cols.append('started_at_date') #move it to end
    #fix column names for orc
    oldColumns = df.schema.names
    newColumns = tx_cols
    df = functools.reduce(
        lambda df, idx: df.withColumnRenamed(
            oldColumns[idx], newColumns[idx]), range(
                len(oldColumns)), df)
    
  • 6

    我们可以用:

    val df = hiveContext.read.table("tableName")

    您的 df.schemadf.columns 将提供实际的列名称 .

  • 0

    如果版本升级不是可用选项,快速修复可能是使用PIG重写ORC文件 . 这似乎工作得很好 .

相关问题