我在用着spark.read.parquet()
从分区中组织镶木地板文件的文件夹中读取。当分区名称以以下结尾时,结果将是错误的f
or 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()
The read_back_df
will be
+---+---+
| 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文档 https://spark.apache.org/docs/2.4.3/sql-data-sources-parquet.html#partition-discovery:
请注意,分区列的数据类型是自动推断的。
您可以通过设置禁用此功能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()
prints
+---+---+
| id|foo|
+---+---+
| 3| 6f|
| 1| 9q|
| 4| 7f|
| 2| 3k|
| 5| 7d|
+---+---+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)