【问题标题】:Partition id getting casted implicitly while reading from s3 in spark/scala从 spark/scala 中的 s3 读取时,分区 id 被隐式转换
【发布时间】:2020-01-25 07:57:19
【问题描述】:

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

Spark 版本:2.4.0

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

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

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

【问题讨论】:

    标签: scala apache-spark amazon-s3 apache-spark-sql parquet


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-04-02
      • 2019-04-14
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 2018-09-04
      • 2018-01-29
      • 1970-01-01
      • 2018-05-05
      相关资源
      最近更新 更多