簡體   English   中英

Spark SQL到Hive表 - 日期時間字段小時錯誤

[英]Spark SQL to Hive table - Datetime Field Hours Bug

我遇到這個問題:當我使用spark.sql數據輸入Hive中的時間戳字段時,小時數奇怪地改為21:00:00!

讓我解釋:

我有一個我用spark.sql讀取的csv文件。 我讀取文件,將其轉換為dataframe並將其存儲在Hive表中。 此文件中的一個字段是“3/10/2017”格式的日期。 我希望輸入Hive中的字段是Timestamp格式(我使用此數據類型而不是Date的原因是我想使用Impala查詢表,而Impala只有Timestamp 數據類型 ,所以它不是一個解決方案只需將數據類型更改為Date)

從文檔中可以看出,Hive Timestamp數據類型具有“YYYY-MM-DD HH:MM:SS”格式,因此在我將數據幀輸入到Hive表之前,我將日期值轉換為適當的格式。

這是我在Python中的代碼:

from datetime import datetime
from pyspark.sql.functions import udf

df = spark.read.csv("hdfs:/user/../MyFile.csv", header=True)

#Use a user defined function to convert date format
def DateConvert(x):
    x_augm = str(x)+" 00:00:00"
    datetime_object = datetime.strptime(x_augm,'%d/%m/%Y %H:%M:%S')
    return datetime_object.strftime('%Y-%m-%d %H:%M:%S')

DateConvert_udf = udf(DateConvert)

df= df.withColumn("Trans_Date", DateConvert_udf("Trans_Date"))

這樣可以正確格式化時間戳。 我跑的時候

df.select("Trans_Date").show(10, False)

我明白了:

 +-------------------+ |Trans_Date | +-------------------+ |2017-10-16 00:00:00| |2017-10-16 00:00:00| |2017-10-16 00:00:00| |2017-10-16 00:00:00| |2017-10-16 00:00:00| |2017-10-16 00:00:00| |2017-10-16 00:00:00| |2017-10-16 00:00:00| |2017-10-16 00:00:00| |2017-10-16 00:00:00| +-------------------+ 

然后我像這樣用Spark SQL將數據導入Hive

df.createOrReplaceTempView('tempTable')
spark.sql("insert into table db.table select * from tempTable")

我的問題是,當我去Hive時,我的Timestamp字段的值如下:

2017-10-16 21:00:00

這是非常奇特的!

提前感謝任何建議

將數據保存到具有TIMESTAMP數據類型的Hive表時,這是常見問題。

將數據保存到Hive表時,TIMESTAMP值表示寫入數據的主機的本地時區。

這里2017-10-16 00:00:00 - UTC(默認)轉換為2017-10-16 21:00:00 - Hive主機的本地TimeZone。

為了避免意外時區問題產生意外結果,Impala時間戳會在寫入數據文件或從數據文件讀取時相對於UTC進行存儲和解釋。

您可以參考以下文檔以獲取必要的配置設置。 https://www.cloudera.com/documentation/enterprise/5-9-x/topics/impala_timestamp.html#timestamp

通過在Spark中創建時間戳時添加浮點數,我能夠解決這個問題。 我只是用HH:MM:SS.ff格式格式化了幾個小時,現在Hive表中的時間顯示為00:00:00,這就是我想要的。

我的新日期轉換例程是:

def DateConvert(x):
    x_augm = str(x)+" 00:00:00.0"
    datetime_object = datetime.strptime(x_augm,'%d/%m/%Y %H:%M:%S.%f')
    return datetime_object.strftime('%Y-%m-%d %H:%M:%S.%f')  

暫無
暫無

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

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