我有一个包含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 回答
问题是Hive版本,即1.2.1,它有这个bug HIVE-4243
这是在2.0.0中修复的 .
设置
解决这个问题 .
如果您也有镶木地板版本,您可以只复制列名称,这就是我所做的(同样,日期列是orc的分区键,因此必须将其移动到最后):
我们可以用:
val df = hiveContext.read.table("tableName")
您的
df.schema
或df.columns
将提供实际的列名称 .如果版本升级不是可用选项,快速修复可能是使用PIG重写ORC文件 . 这似乎工作得很好 .