使用 Spark 数据帧的 Hive 分区中缺少日期的前导零



我正在向Spark数据帧添加一个分区列。新列包含年月和日。我的数据框中有一个时间戳列。

DataFrame dfPartition = df.withColumn("year", df.col("date").substr(0, 4));
dfPartition = dfPartition.withColumn("month", dfPartition.col("date").substr(6, 2));
dfPartition =  dfPartition.withColumn("day", dfPartition.col("date").substr(9, 2));

当我输出数据帧时,我可以看到正确的列值,例如:2016 01 08

但是当我将此数据帧导出到蜂巢表时,例如

dfPartition.write().partitionBy("year", "month","day").mode(SaveMode.Append).saveAsTable("testdb.testtable");

我看到生成的目录结构缺少前导零。我试图将列转换为字符串,但没有工作。

有没有办法在蜂巢分区中捕获两位数的日期/月份

谢谢

根据 Spark 文档,分区列类型推理是默认启用的功能。OP 字符串值,因为它们可以解释为整数,因此被转换为整数。如果这在整个 Spark 会话中是不可取的,可以通过将相应的 Spark 配置属性设置为 false 来禁用它:

SparkSession.builder.config("spark.sql.sources.partitionColumnTypeInference.enabled", value = false)

或者通过使用 SQL 运行相应的 SET key=value 命令。否则,可以使用J.Doe建议的相应Spark本机格式字符串函数在列级别单独抵消它。

请参阅将前导零添加到 Spark 数据框中的列

您可以通过以下答案看到如何添加前导 0 的答案:

 val df2 = df
        .withColumn("month", format_string("%02d", $"month"))

我使用下面的代码片段在我的代码上尝试了这个,它奏效了!

            .withColumn("year", year(col("my_time")))
            .withColumn("month", format_string("%02d",month(col("my_time")))) //pad with leading 0's
            .withColumn("day", format_string("%02d",dayofmonth(col("my_time")))) //pad with leading 0's
            .withColumn("hour", format_string("%02d",hour(col("my_time")))) //pad with leading 0's
            .writeStream
            .partitionBy("year", "month", "day", "hour")

相关内容

  • 没有找到相关文章

最新更新