【发布时间】:2016-12-05 02:29:45
【问题描述】:
我有一个包含 ORC 文件的目录。我正在使用下面的代码创建一个 DataFrame
var data = sqlContext.sql("SELECT * FROM orc.`/directory/containing/orc/files`");
它返回具有此架构的数据框
[_col0: int, _col1: bigint]
预期的架构在哪里
[scan_nbr: int, visit_nbr: bigint]
当我查询 parquet 格式的文件时,我得到了正确的架构。
我是否缺少任何配置?
添加更多细节
这是 Hortonworks Distribution HDP 2.4.2(Spark 1.6.1、Hadoop 2.7.1、Hive 1.2.1)
我们没有更改 HDP 的默认配置,但这绝对不同于普通版 Hadoop。
数据由上游 Hive 作业写入,一个简单的 CTAS(CREATE TABLE 示例 STORED AS ORC as SELECT ...)。
我使用最新的 2.0.0 配置单元在 CTAS 生成的文件上对此进行了测试,它保留了 orc 文件中的列名。
【问题讨论】:
-
对我来说很好用。你能补充一些细节吗?配置、版本、保存数据的方式...
-
添加了更多细节
-
我的 2 美分:检查 所有 文件是否具有完全相同的架构;由于 Hive 将“理论”列名称存储在其 MetaStore 中,因此它可能会忽略差异;但是由于您需要 Spark 直接打开文件,因此如果这些文件显示不同的列名,它可能会退回到列号... cf。 cwiki.apache.org/confluence/display/Hive/…
-
@SamsonScharfrichter 查看 orc 文件转储,很明显文件中的列名存储为 _col0、_col1。生成这些文件的上游 hive 作业是 CTAS 语句。在创建这些配置时,我们是否需要将任何其他配置传递给 Hive?
-
@SamsonScharfrichter 感谢有关兽人文件转储的指针。这帮助我确定了根本原因。
标签: apache-spark apache-spark-sql apache-hive