【问题标题】:Spark SQL on ORC files doesn't return correct Schema (Column names)ORC 文件上的 Spark SQL 不返回正确的架构(列名)
【发布时间】: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


【解决方案1】:

问题是Hive版本,也就是1.2.1,有这个bugHIVE-4243

这已在 2.0.0 中修复。

【讨论】:

    【解决方案2】:

    设置

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

    解决了这个问题。

    【讨论】:

      【解决方案3】:

      如果你也有 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)
      

      【讨论】:

        【解决方案4】:

        我们可以使用:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 我不明白这是如何回答这个问题的。
          猜你喜欢
          • 2021-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多