apache-spark - 读取分区 Parquet 时,Spark 错误地将以 'd' 或 'f' 结尾的分区名称解释为数字

标签 apache-spark pyspark

我正在使用 spark.read.parquet() 从一个文件夹中读取,在该文件夹中, Parquet 文件被组织在分区中。当分区名称以 f 或 d 结尾时,结果将是错误的。显然,Spark 会将它们解释为数字而不是字符串。我创建了一个最小的测试用例,如下所示来重现问题。

df = spark.createDataFrame([
            ('9q', 1),
            ('3k', 2),
            ('6f', 3),
            ('7f', 4),
            ('7d', 5),
     ],
     schema='foo string, id integer'
)
df.write.partitionBy('foo').parquet('./tmp_parquet', mode='overwrite')
read_back_df = spark.read.parquet('./tmp_parquet')
read_back_df.show()
read_back_df 将是
+---+---+                                                                       
| id|foo|
+---+---+
|  1| 9q|
|  4|7.0|
|  3|6.0|
|  2| 3k|
|  5|7.0|
+---+---+
注意分区 6f/7f/7d 变成了 6.0/7.0/7.0。
Spark 版本是 2.4.3。

最佳答案

您看到的行为是预期的。
来自 Spark documentation :

Notice that the data types of the partitioning columns are automatically inferred.


您可以通过设置 spark.sql.sources.partitionColumnTypeInference.enabled 禁用此功能。为假。
以下代码在读取 parquet 文件时保留字符串:
spark.conf.set("spark.sql.sources.partitionColumnTypeInference.enabled", False)
read_back_df = spark.read.parquet('./tmp_parquet')
read_back_df.show()
打印
+---+---+                                                                       
| id|foo|
+---+---+
|  3| 6f|
|  1| 9q|
|  4| 7f|
|  2| 3k|
|  5| 7d|
+---+---+

关于apache-spark - 读取分区 Parquet 时,Spark 错误地将以 'd' 或 'f' 结尾的分区名称解释为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62671684/

相关文章:

sockets - 异常: could not open socket on pyspark

scala - 将多个小文件合并到 Spark 中的几个大文件中

hadoop - 异常 : java. Spark 中的 lang.Exception : When running with master 'yarn' either HADOOP_CONF_DIR or YARN_CONF_DIR must be set in the environment.

hadoop - 为什么此示例导致NaN?

scala - 如何在对RDD中找到最大值?

apache-spark - 对 rdd int 数组执行求和

apache-spark-sql - 查找一个数据帧在另一个数据帧中所有出现的值的最佳方法是什么?

json - 使用分区 JSON 进行 Spark 分区投影/下推和模式推断

azure - Spark - 如何从数据帧列中获取带有父文件夹的文件名

apache-spark - Spark 提交错误 :Name or service not known