从 spark/scala 中的 s3 读取时隐式转换分区 ID

Partition id getting casted implicitly while reading from s3 in spark/scala

我在 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.02.0.

Spark 版本:2.4.0

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

用于写入和读取分区数据的命令to/from 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")