Apache spark Spark错误地解释了以';d';或';f';当阅读分区拼花时作为数字
我正在使用spark.read.parquet()从一个文件夹中读取,其中拼花文件以分区的形式组织。当分区名称以f或d结尾时,结果将是错误的。显然,Spark将把它们解释为数字而不是字符串。我已经创建了一个最小的测试用例,如下所示来重现这个问题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),
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是浮点的有效表达式。