首页 > 解决方案 > 从 spark/scala 中的 s3 读取时,分区 id 被隐式转换

问题描述

我在 s3 中有源数据,我的 spark/scala 应用程序将读取这些数据并在将其分区到新列后将其写入为镶木地板文件partition_id。的值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.0, 2.0

火花版本:2.4.0

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

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

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

标签: scalaapache-sparkamazon-s3apache-spark-sqlparquet

解决方案


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

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

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

推荐阅读