我在从配置单元表读取 Spark 数据帧时遇到问题。我将数据框存储为:
dataframe.coalesce(n_files).write.option("mergeSchema", "true").mode("overwrite").parquet(table_path)
当我尝试读取此数据框并执行操作时.show()
在它上面,它会因以下错误而中断:
java.lang.UnsupportedOperationException: parquet.column.values.dictionary.PlainValuesDictionary$PlainIntegerDictionary
at parquet.column.Dictionary.decodeToLong(Dictionary.java:52)
如何找到哪一列是此错误的根本原因?
我试图遵循答案here https://stackoverflow.com/questions/53149457/java-lang-unsupportedoperationexception-error-in-spark-when-writing。但我能够完全加载 df 并读取镶木地板文件,即:
df = spark.read.option("mergeSchema", "True").parquet("/hdfs path to parquets")
- 所述hive表是外部表。我猜这与表属性有关?但我应该看什么?
- 我无法使用
saveAsTable
。由于以下原因,我需要直接写入路径一定的要求 https://stackoverflow.com/questions/38964736/multiple-spark-jobs-appending-parquet-data-to-same-base-path-with-partitioning
找到了我的问题的根本原因。在这里发布我的发现,以便有需要的人可以检查他们的情况是否相同。
我遇到这个问题是因为配置单元表元数据和镶木地板中的数据类型不同。问题是当你做一个saveAsTable
如果有任何差异,spark 将在保存时对您的数据进行类型转换。但是当你做一个df.write.parquet(path)
您正在将镶木地板直接写入路径,因此如果表元数据和镶木地板之间存在不匹配,df.show
会抛出错误。
例如,如果您的表元数据具有 dtype'bigint'
对于 A 列,但您尝试保存的 df 具有 dtypeIntegerType
对于同一列(而不是LongType
,这是正确的解释bigint
), a saveAsTable
会打字IntegerType
to LongType
but df.write.parquet(path)
won't.
解决方案是将有问题的列类型转换为与表的元数据匹配的数据类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)