【问题标题】:Missing leading zeroes of date in Hive partition using Spark Dataframe使用 Spark Dataframe 在 Hive 分区中缺少日期的前导零
【发布时间】:2016-05-17 17:57:25
【问题描述】:

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

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");

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

有没有办法在 hive 分区中捕获两位数字日期/月份

谢谢

【问题讨论】:

  • 你的日期栏是什么类型的?如果是整数类型,这可能是他在解析过程中删除前导零的原因。
  • 它的字符串,我也在该列上做子字符串(它也返回字符串)我也可以在数据帧输出中看到 0。
  • 这看起来像 spark 中的一个错误:您确实拥有应该保留 0 的正确数据类型(字符串)。随意在 spark 用户的列表上提问:他们可能会要求您提交报告。

标签: java hadoop apache-spark hive apache-spark-sql


【解决方案1】:

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

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

或通过使用 SQL 运行相应的SET key=value 命令。否则,可以按照 J.Doe 的建议,在列级别使用相应的 Spark-native format-string function 单独抵消它。

【讨论】:

    【解决方案2】:

    参考Add leading zeros to Columns in a Spark Data Frame

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

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

    我使用下面的 sn-p 对我的代码进行了尝试,它成功了!

                .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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-15
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 2015-04-29
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      相关资源
      最近更新 更多