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