orc文件上的spark sql不返回正确的架构(列名)

qkf9rpyu  于 2021-06-28  发布在  Hive
关注(0)|答案(5)|浏览(359)

我有一个包含orc文件的目录。我正在使用下面的代码创建一个Dataframe

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

它返回具有此模式的Dataframe

[_col0: int, _col1: bigint]

其中预期的模式是

[scan_nbr: int, visit_nbr: bigint]

当我查询Parquet格式的文件时,我得到了正确的模式。
是否缺少任何配置?
添加更多详细信息
这是hortonworks发行版HDP2.4.2(spark 1.6.1、hadoop 2.7.1、hive 1.2.1)
我们没有改变hdp的默认配置,但是这绝对不是hadoop的普通版本。
数据是由上游配置单元作业编写的,这是一个简单的cta(create table sample stored as orc as select…)。
我用最新的2.0.0配置单元在ctas生成的文件中测试了这个功能&它保留了orc文件中的列名。

fumotvh3

fumotvh31#

我们可以使用: val df = hiveContext.read.table("tableName") 你的 df.schema 或者 df.columns 将给出实际的列名。

q9yhzks0

q9yhzks02#

设置

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

解决了这个问题。

r7xajy2e

r7xajy2e3#

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

q9rjltbz4#

若版本升级不是一个可用的选项,那个么快速修复方法就是使用pig重写orc文件。这似乎很管用。

n6lpvg4x

n6lpvg4x5#

问题是hive版本是1.2.1,它有一个错误hive-4243
这是在2.0.0中修复的。

相关问题