3

我正在尝试在 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

我收到以下警告:-

2002 年 7 月 18 日 18:02:02 WARN ReaderImpl:在 _col0、_col1、_col2、_col3、_col4、_col5、_col6、_col7、_col8、_col9、_col10、_col11、_col12、_col13、_col14 中找不到字段: _col15, _col16, _col17, _col18, _col19, _col20, _col21, _col22, _col23, _col24, _col25, _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, _col15, _col32, _col9, _col11, _col41, _col20, _col2, _col25, _col24, _49, col_64, _49, col_64 _col14,_col13,_col19,_col43,_col65,_col29,_col10,_col7,_col21,_col39,_col46,_col4,_col5,_col62,_col0,_col30,_col47,trans_dt,_col57,_col16,_col36,_col1,_col38, _col55,_col51,_col60,_col53];在 org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:42)

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

非常感谢您的建议。

4

4 回答 4

2

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

于 2019-12-24T13:02:02.223 回答
2

I found workaround with reading table such way:

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

spark.read.schema(schema).orc("/path/to/table")
于 2019-03-12T09:45:59.597 回答
0

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

于 2018-07-03T06:17:32.637 回答
0

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

于 2020-11-17T04:13:40.743 回答