簡體   English   中英

使用 Spark Dataframe 在 Hive 分區中缺少日期的前導零

[英]Missing leading zeroes of date in Hive partition using Spark Dataframe

我正在向 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 分區中捕獲兩位數的日期/月份

謝謝

根據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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM