3

我有一个包含 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(创建 TABLE 示例 STORED AS ORC as SELECT ...)。

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

4

5 回答 5

7

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

这已在 2.0.0 中修复。

于 2016-10-10T12:44:46.527 回答
1

环境

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

解决这个问题。

于 2018-05-17T08:21:35.327 回答
0

我们可以用:

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

您的df.schemadf.columns将给出实际的列名。

于 2017-08-10T06:11:48.617 回答
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)
于 2017-03-02T01:06:13.823 回答
-2

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

于 2017-04-20T03:25:51.900 回答