如何使用具有不受支持类型的 Spark 读取镶木地板?

Posted

技术标签:

【中文标题】如何使用具有不受支持类型的 Spark 读取镶木地板?【英文标题】:How do I read parquet with Spark that has unsupported types? 【发布时间】:2020-04-20 18:59:08 【问题描述】:

我想使用 PySpark 从包含 UINT64 列的 parquet 文件中提取数据,这些列当前映射到 Spark 中的 typeNotSupported()。我不需要这些列,所以我希望我可以通过以下命令使用谓词下推来拉出其他列:

spark.read.parquet('path/to/dir/').select('legalcol1', 'legalcol2')

但是,我仍然遇到以下错误。

An error was encountered:
An error occurred while calling o86.parquet.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, 
most recent failure: Lost task 0.3 in stage 0.0 (TID 3, ..., executor 1):
org.apache.spark.sql.AnalysisException: Parquet type not supported: INT64 (UINT_64);

有没有办法在不引发上述错误的情况下摄取这些数据?

【问题讨论】:

您使用的是哪个版本的 spark ? 我使用的是 2.4.3 版本 AFAIK 与 spark 是不可能的。可能您必须使用镶木地板工具进行这些转换? 【参考方案1】:

您可以尝试将任何列类型转换为另一种列类型:

val df = spark.read.parquet('path/to/dir/')

df.select(col('legalcol1').cast('string').alias('col1'), col('legalcol2').cast('string').alias('col2'))

转换为 bigint 列类型:

df.select(col('uint64col').cast('bigint').alias('bigint_col'))

【讨论】:

这不是问题的答案。 您可以进行任何属于该事项的调整,并像上面的示例一样进行适当的类型转换。 @jo0gbe4bstjb 这不是一个答案,因为 read 的类似会引发异常。

以上是关于如何使用具有不受支持类型的 Spark 读取镶木地板?的主要内容,如果未能解决你的问题,请参考以下文章

读取列中具有混合数据类型的镶木地板文件

如何在读取前根据定义的模式读取 pyspark 中的镶木地板文件?

读取镶木地板文件时,有没有办法在 basePath 中使用通配符?

如何使用 pyarrow 和 parquet 保存具有自定义类型的 pandas DataFrame

由于 ExecutorLostFailure,无法使用 spark 读取镶木地板文件

从具有时间戳的镶木地板蜂巢表中读取火花