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

时间:2016-07-30 13:46:18

标签: apache-spark apache-spark-sql apache-hive

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

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

它返回带有此架构的数据框

[_col0: int, _col1: bigint]

预期架构在哪里

[scan_nbr: int, visit_nbr: bigint]

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

我错过了任何配置吗?

添加更多详情

这是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 hive& amp;它保留了orc文件中的列名。

5 个答案:

答案 0 :(得分:6)

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

这已在2.0.0中修复。

答案 1 :(得分:1)

设置

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

解决了这个问题。

答案 2 :(得分:0)

如果你也有镶木地板版本,你可以只复制列名,这就是我所做的(同样,日期列是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)

答案 3 :(得分:0)

我们可以使用:

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

您的df.schemadf.columns会提供实际的列名。

答案 4 :(得分:-2)

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