我在 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 文件再次读入数据帧时,1d
、2d
等值正在转换为1.0
、2.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")