【问题标题】:Spark DataFrame ORC Hive table reading issueSpark DataFrame ORC Hive 表读取问题
【发布时间】:2018-12-11 07:03:28
【问题描述】:

我正在尝试在 Spark 中读取 Hive 表。以下是 Hive 表格式:

# Storage Information       
SerDe Library:  org.apache.hadoop.hive.ql.io.orc.OrcSerde   
InputFormat:    org.apache.hadoop.hive.ql.io.orc.OrcInputFormat 
OutputFormat:   org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat    
Compressed: No  
Num Buckets:    -1  
Bucket Columns: []  
Sort Columns:   []  
Storage Desc Params:        
    field.delim \u0001
    serialization.format    \u0001

当我尝试通过以下命令使用 Spark SQL 读取它时:

val c = hiveContext.sql("""select  
        a
    from c_db.c cs 
    where dt >=  '2016-05-12' """)
c. show

我收到以下警告:-

18/07/02 18:02:02 WARN ReaderImpl: 找不到字段: a in _col0, _col1,_col2,_col3,_col4,_col5,_col6,_col7,_col8,_col9,_col10,_col11,_col12,_col13,_col14,_col15,_col16,_col17,_col18,_col19,_col20,_col21,3,_col22,_col22 _col26,_col27,_col28,_col29,_col30,_col31,_col32,_col33,_col34,_col35,_col36,_col37,_col38,_col39,_col40,_col41,_col42,_col43,_col44,_col45,_col46,_col47,_col48,_col49,_col50, _col51,_col52,_col53,_col54,_col55,_col56,_col57,_col58,_col59,_col60,_col61,_col62,_col63,_col64,_col65,_col66,_col67,

读取开始,但速度很慢,网络超时。

当我尝试直接读取 Hive 表目录时,出现以下错误。

val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
hiveContext.setConf("spark.sql.orc.filterPushdown", "true") 
val c = hiveContext.read.format("orc").load("/a/warehouse/c_db.db/c")
c.select("a").show()

org.apache.spark.sql.AnalysisException:无法解析给定输入的“a” 列:[_col18、_col3、_col8、_col66、_col45、_col42、_col31、 _col17, _col52, _col58, _col50, _col26, _col63, _col12, _col27, _col23, _col6, _col28, _col54, _col48, _col33, _col56, _col22, _col35, _col44, _col67, _col19, _col32, _col15, _col32, _col15, _col32, _col _col2,_col25,_col24,_col64,_col40,_col34,_col61,_col49,_col14,_col13,_col19,_col43,_col65,_col29,_col10,_col7,_col21,_col39,_col46,_col4,_col4,_col5,_col_26, trans_dt,_col57,_col16,_col36,_col38,_col59,_col1,_col37,_col55,_col51,_col60,_col53]; 在 org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42)

我可以将 Hive 表转换为 TextInputFormat,但这应该是我的最后一个选择,因为我想利用 OrcInputFormat 来压缩表大小。

非常感谢您的建议。

【问题讨论】:

  • 你能执行show create table c_db.c并提供输出给我们吗?

标签: apache-spark hive apache-spark-sql orc hive-table


【解决方案1】:

我找到了这样的阅读表解决方法:

val schema = spark.table("db.name").schema

spark.read.schema(schema).orc("/path/to/table")

【讨论】:

  • 什么是“db.name”参数?
  • 我的意思是“database.tableName”
【解决方案2】:

此问题通常发生在大型表中,因为它无法读取到最大字段长度。我添加了元存储读取为 true (set spark.sql.hive.convertMetastoreOrc=true;),它对我有用。

【讨论】:

    【解决方案3】:

    我认为该表没有命名列,或者如果有,Spark 可能无法读取名称。 您可以使用错误中提到的 Spark 提供的默认列名。或者也可以在 Spark 代码中设置列名。 使用 printSchema 和 toDF 方法重命名列。但是,是的,您将需要映射。这可能需要单独选择和显示列。

    【讨论】:

    • 感谢您的回复。这是一个大约 3 TB 的巨大表,有 60 多列。不确定我能否单独映射所有列。令人惊讶的是,当我描述 df 时,它正确显示了所有列名。
    【解决方案4】:

    设置 (set spark.sql.hive.convertMetastoreOrc=true;) conf 工作正常。但它试图修改配置单元表的元数据。你能解释一下,要修改什么,它会影响表格吗? 谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-02
      • 2022-12-23
      • 1970-01-01
      • 2017-06-17
      • 2019-12-27
      • 2021-10-23
      • 2017-01-21
      • 1970-01-01
      相关资源
      最近更新 更多