我有一个包含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文件中的列名。
答案 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.schema
或df.columns
会提供实际的列名。
答案 4 :(得分:-2)
如果版本升级不是可用选项,快速修复可能是使用PIG重写ORC文件。这似乎工作得很好。