Spark DataFrame ORC Hive表读取问题

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

我收到以下警告:
18/07/02 18:02:02 WARN ReaderImpl:无法找到a字段,_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: 给定输入列[_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, _col64, _col40, _col34, _col61, _col49, _col14, _col13, _col19, _col43, _col65, _col29, _col10, _col7, _col21, _col39, _col46, _col4, _col5, _col62, _col0, _col30, _col47, trans_dt, _col57, _col16, _col36, _col38, _col59, _col1, _col37, _col55, _col51, _col60, _col53],无法解析'a'。

我可以将Hive表转换为TextInputFormat,但这应该是我的最后选择,因为我想获得OrcInputFormat压缩表大小的好处。

非常感谢您的建议。


你能执行 show create table c_db.c 并提供输出吗? - Abdulhafeth Sartawi
4个回答

2

这个问题通常发生在大表中,因为它无法读取到最大字段长度。我将元数据存储的读取设为true (set spark.sql.hive.convertMetastoreOrc=true;),这样问题就解决了。


2
我找到了一种解决方法,可以通过以下方式读取表格:

我找到了解决方法,可以这样读取表格:

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

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

“db.name”参数应该是什么? - Vivek Sethi
我指的是 "数据库.表名"。 - K. Kostikov

0

我认为该表没有命名列,或者即使它有,Spark也无法正确读取名称。您可以使用Spark提供的默认列名(如错误中所述),也可以在Spark代码中设置列名。使用printSchema和toDF方法重命名列。但是,您需要进行映射。这可能需要逐个选择和显示列。


感谢您的回复。这是一个大约3TB大小,有60多列的巨型表格。我不确定是否能够逐个映射所有列。令人惊讶的是,当我描述df时,它正确显示了所有列名。 - Subhasis

0

设置(set spark.sql.hive.convertMetastoreOrc=true;) 配置是有效的。但它试图修改 Hive 表的元数据。请问可以解释一下,它将要修改什么,是否会影响表格。 谢谢


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接