Spark错误:parquet.column.values.dictionary.PlainValuesDictionary$PlainIntegerDictionary

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)
  • 所述hive表是外部表。我猜这与表属性有关?但我应该看什么?
  • 我无法使用saveAsTable. 由于某种需求,我需要直接写入路径

Ayu*_*yal 12

找到了我的问题的根本原因。在这里发布我的发现,以便有需要的人可以检查他们的情况是否相同。

我遇到这个问题是因为配置单元表元数据和镶木地板中的数据类型不同。问题是,当您执行saveAsTableSpark 操作时,如果有任何差异,则会在保存时对您的数据进行类型转换。但是,当您执行 a 操作时df.write.parquet(path),您会将镶木地板直接写入路径,因此如果表元数据和镶木地板之间不匹配,df.show则会引发错误。

例如,如果您的表元数据具有'bigint'A 列的 dtype,但您尝试保存的 df 具有IntegerType同一列的 dtype(而不是LongType,这是 的正确解释bigint),则 asaveAsTable会类型转换IntegerTypeLongTypedf.write.parquet(path)不会。

解决方案是将有问题的列类型转换为与表的元数据匹配的数据类型。