我面临这样一个问题:当我用火花.sql 数据,时间奇怪地变为21:00:00!在
让我解释一下:
我有一个csv文件可以用来阅读火花.sql. 我读取文件,将其转换为dataframe并将其存储在配置单元表中。此文件中的一个字段是格式为“3/10/2017”的日期。配置单元中我要输入的字段是Timestamp格式(我使用此数据类型而不是Date的原因是我想用Impala查询表,而Impala只有时间戳data type,所以不能简单地将数据类型更改为Date)
正如您从文档中看到的,配置单元时间戳数据类型具有“YYYY-MM-DD HH:MM:SS”格式,因此在将数据帧输入配置单元表之前,我将日期值转换为适当的格式。在
下面是我用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"))
这将正确格式化时间戳。当我跑的时候
^{pr2}$我得到:
+-------------------+ |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| +-------------------+
然后用sparksql将数据导入Hive,如下所示
df.createOrReplaceTempView('tempTable')
spark.sql("insert into table db.table select * from tempTable")
我的问题是,当我进入配置单元时,时间戳字段的值如下:
2017-10-16 21:00:00
这太奇怪了!在
提前谢谢你的建议
通过在Spark中创建时间戳时添加浮点数字,我可以解决这个问题。我只需将小时设置为HH:MM:不锈钢ff配置单元表中的格式和时间现在显示为00:00:00,这是我想要的。在
我的新日期转换程序是:
这是将数据保存到具有时间戳数据类型的配置单元表中时的常见问题。在
将数据保存到配置单元表中时,时间戳值表示写入数据的主机的本地时区。在
这里将2017-10-16 00:00:00-UTC(默认)转换为2017-10-16 21:00:00-配置单元主机的本地时区。在
为了避免意外的时区问题产生不希望出现的结果,在Impala中,时间戳在写入或读取数据文件时都会相对于UTC进行存储和解释。在
您可以参考下面的文档了解必要的配置设置。 https://www.cloudera.com/documentation/enterprise/5-9-x/topics/impala_timestamp.html#timestamp
相关问题 更多 >
编程相关推荐