Ayu*_*yal 5 hive apache-spark pyspark
我在从配置单元表读取 Spark 数据帧时遇到问题。我将数据框存储为:
dataframe.coalesce(n_files).write.option("mergeSchema", "true").mode("overwrite").parquet(table_path)
Run Code Online (Sandbox Code Playgroud)
当我尝试读取此数据帧并.show()
对其执行操作时,它会因以下错误而中断:
java.lang.UnsupportedOperationException: parquet.column.values.dictionary.PlainValuesDictionary$PlainIntegerDictionary
at parquet.column.Dictionary.decodeToLong(Dictionary.java:52)
Run Code Online (Sandbox Code Playgroud)
如何找到哪一列是此错误的根本原因?我试图遵循这里的答案。但我能够完美地加载 df 并读取镶木地板文件,即:
df = spark.read.option("mergeSchema", "True").parquet("/hdfs path to parquets")
Run Code Online (Sandbox Code Playgroud)
saveAsTable
. 由于某种需求,我需要直接写入路径Ayu*_*yal 12
找到了我的问题的根本原因。在这里发布我的发现,以便有需要的人可以检查他们的情况是否相同。
我遇到这个问题是因为配置单元表元数据和镶木地板中的数据类型不同。问题是,当您执行saveAsTable
Spark 操作时,如果有任何差异,则会在保存时对您的数据进行类型转换。但是,当您执行 a 操作时df.write.parquet(path)
,您会将镶木地板直接写入路径,因此如果表元数据和镶木地板之间不匹配,df.show
则会引发错误。
例如,如果您的表元数据具有'bigint'
A 列的 dtype,但您尝试保存的 df 具有IntegerType
同一列的 dtype(而不是LongType
,这是 的正确解释bigint
),则 asaveAsTable
会类型转换IntegerType
为LongType
但df.write.parquet(path)
不会。
解决方案是将有问题的列类型转换为与表的元数据匹配的数据类型。
归档时间: |
|
查看次数: |
10973 次 |
最近记录: |