分区 ID 在 Spark/scala 中从 s3 读取时隐式强制转换



我在 s3 中有源数据,我的 spark/scala 应用程序将在新的列partition_id上分区后读取此数据并写入 parquet 文件。partition_id的值将通过从另一个具有字母数字字符串值的 id 列中获取前两个字符来派生。 例如:

id = 2dedfdg34h, partition_id = 2d

将数据写入 s3 后,将为每个分区创建单独的分区文件夹,一切看起来都不错。 例如:

PRE partition_id=2d/
PRE partition_id=01/
PRE partition_id=0e/
PRE partition_id=fg/
PRE partition_id=5f/
PRE partition_id=jk/
PRE partition_id=06/
PRE partition_id=07/

但是当我将这些 s3 文件再次读入数据帧时,1d2d等值正在转换为1.02.0

火花版本:2.4.0

请建议如何避免这种隐式转换。

用于向 s3 写入和读取分区数据的命令:

dataframe.write.partitionBy("partition_id").option("compression", "gzip").parquet(<path>)
spark.read.parquet(<path>)

这里的问题是 Spark 错误地推断分区列的列类型是一个数字。这是由于某些值是数字(Spark不会查看所有值(。

为了避免这种情况,您只需在读取数据时关闭分区列的自动类型推断即可。这将根据需要为您提供原始字符串值。这可以按如下方式完成:

spark.conf.set("spark.sql.sources.partitionColumnTypeInference.enabled", "false")

最新更新