Apache spark Spark错误地解释了以';d';或';f';当阅读分区拼花时作为数字

Apache spark Spark错误地解释了以';d';或';f';当阅读分区拼花时作为数字,apache-spark,pyspark,Apache Spark,Pyspark,我正在使用spark.read.parquet()从一个文件夹中读取,其中拼花文件以分区的形式组织。当分区名称以f或d结尾时,结果将是错误的。显然,Spark将把它们解释为数字而不是字符串。我已经创建了一个最小的测试用例,如下所示来重现这个问题 df = spark.createDataFrame([ ('9q', 1), ('3k', 2), ('6f', 3), ('7f', 4),

我正在使用spark.read.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()
回读数据将被删除

+---+---+                                                                       
| id|foo|
+---+---+
|  1| 9q|
|  4|7.0|
|  3|6.0|
|  2| 3k|
|  5|7.0|
+---+---+
注意,分区6f/7f/7d变为6.0/7.0/7.0


火花塞为2.4.3。

您看到的行为是预期的

从:

请注意,分区列的数据类型是自动推断的

您可以通过将
spark.sql.sources.partitionColumnTypeEnference.enabled
设置为False来禁用此功能

以下代码在读取拼花地板文件时保留字符串:

spark.conf.set(“spark.sql.sources.partitionColumnTypeInference.enabled”,False)
read_back_df=spark.read.parquet('./tmp_parquet'))
读回
印刷品

+--+--+
|id|foo|
+---+---+
|3 | 6f|
|1 | 9q|
|4 | 7f|
|2 | 3k|
|5 | 7d|
+---+---+

谢谢你的回答。上述设置的改变确实有效。然而,我觉得还有一个问题没有回答。为什么像6f或7f这样的值会被推断为float?这不奇怪吗?看看。Spark只是获取文件夹的名称并尝试解析名称。6f是浮点的有效表达式。