sparkDataframe或配置单元表读取问题

yvfmudvl  于 2021-06-26  发布在  Hive
关注(0)|答案(4)|浏览(462)

我在试着读星火里的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

我在下面warning:-
18/07/07/02 18:02 18/07/02 18:02:02警告读者mpl:找不到域:找不到域:找不到域:找不到域:a in u col0,,\u col1,\u col1,\u col2,\u col3,\u col4,\u col5,\u col6,\u col7,\u col8,\u col8,\u col8,\u col8,\u col1,\u col1,\u col1,\u col1,\u col2,\u col3,\u col4,\u col4,\u col7,\u col7,\u col8,\u col8,\u col8,\u col8,\u col8,\u col8,\u col8,\u col8,\u col8,\u col8,\u col8,\u col8,\u col8,\u col8,\u col8,\u col8第33列、第34列、第35列、第36列,第37列、第38列、第39列、第40列、第41列、第42列、第43列、第44列、第45列、第46列、第47列、第48列、第49列、第50列、第51列、第52列、第53列、第54列、第55列、第56列、第57列、第58列、第59列、第60列、第61列、第62列、第63列、第64列、第65列、第66列、第67列,
读取开始,但速度非常慢,网络超时。
当我试图直接读取配置单元表目录时,出现以下错误。

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()

该公司的调查结果是:无法解决“一个”给定的“一个”给定的输入列:无法解决“一个”给定的“一个”给定的“一个”输入列:无法解决“一个”给定的“一个”给定的“一个”输入列:无法解决“一个”给定的“一个”给定的“一个”给定的“一个”输入列:无法解决“一个”给定的“一个”的“一个”输入列:[\u col18,\u col18,\u col8,\u col66,\u col45,\u col45,\u col45,,\u col42,,\u col42,,\u col42,,\u col42,,\u col31,,,\u col31,,,,,,,,,\u col31,,,,,,,,,,,,,,,\u col31,,,,,,,,,,,,,,,,,,,,,,,,是的,第24列、第64列、第40列、第34列、第61列、第49列、第14列、第13列、第19列、第43列、第65列、第29列、第10列、第7列、第21列、第39列、第46列、第4列、第5列、第62列、第0列、第30列、第47列、第57列、第16列、第36列、第38列、第59列、第1列、第37列、第55列、第51列、第60列、第53列];在org.apache.spark.sql.catalyst.analysis.package$analysiserrorat.failanalysis(package。scala:42)
我可以将配置单元表转换为textinputformat,但这应该是我的最后一个选择,因为我想利用orcinputformat来压缩表的大小。
非常感谢你的建议。

xoshrz7s

xoshrz7s1#

设置(set spark.sql.hive.convertmetastoreorc=true;)conf正在工作。但它试图修改配置单元表的元数据。你能给我解释一下,要修改什么,对table有什么影响吗。谢谢

dsf9zpds

dsf9zpds2#

我发现阅读表的解决方法如下:

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

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

pinkon5k3#

这个问题通常发生在大型表中,因为它无法读取到最大字段长度。我添加了meta store read as true( set spark.sql.hive.convertMetastoreOrc=true; )这对我很有效。

uoifb46i

uoifb46i4#

我认为表没有命名列,或者如果有,spark可能无法读取这些名称。您可以使用spark在错误中提到的默认列名。也可以在spark代码中设置列名。使用printschema和todf方法重命名列。但是,是的,您需要Map。这可能需要分别选择和显示列。

相关问题