来自 Hive 的 Pyspark 数据中带有毫秒 'YYYY-MM-DD hh:mm:ss.SSS' 的日期
Posted
技术标签:
【中文标题】来自 Hive 的 Pyspark 数据中带有毫秒 \'YYYY-MM-DD hh:mm:ss.SSS\' 的日期【英文标题】:Date with Milliseconds 'YYYY-MM-DD hh:mm:ss.SSS' for in Pyspark data from Hive来自 Hive 的 Pyspark 数据中带有毫秒 'YYYY-MM-DD hh:mm:ss.SSS' 的日期 【发布时间】:2020-06-12 16:20:47 【问题描述】:我有一个日期字段作为字符串存储在 HIVE 表中,格式如下:
YYYY-MM-DD hh:mm:ss.SSS
例如:
2020-01-20 07:41:21.86754
但是,我们看到了以下行为:
当我们在 PySpark 中选择列为to_timestamp()
时,我们得到NULL
。
当我们选择它作为普通字符串时,它显示为2020-01-20 07:41:....
;它没有显示全部价值。
当我们尝试截断毫秒时,它会正确显示为 2020-01-20 07:41:21
,但我们希望将毫秒包含在 PySpark DateFrame 中以执行转换。
查询以字符串形式存储的日期的正确方法是什么?
【问题讨论】:
您好!为了提高可读性,我对您的帖子进行了一些编辑。请务必查看它们以确保所有内容都传达了您的预期含义,同时也学习如何在未来格式化您的帖子。值得注意的是,我使用反引号 (`) 将日期格式格式化为代码块,并将项目符号格式化为列表,将每个项目符号放在自己的行上。在此过程中,我还对措辞进行了一些更改以帮助澄清问题,并在最后重申了该问题。请查看,如果一切合理,请告诉我。 @Naresh - 你试过下面的答案吗?成功了吗? 【参考方案1】:在我开始之前,关于时间格式的问题。为什么毫秒值是 86754?这意味着 86 秒和 754 毫秒?你的意思是微秒?那么它是有道理的。
无论如何,我尝试使用相同的日期格式来检查 spark 是否可以处理它。
考虑一个测试数据框
import pyspark.sql.functions as F
test_df= sqlContext.createDataFrame(["2020-01-20 07:41:21.86754","2020-01-20 07:41:21.86999"],"string").toDF('date')
test_df.show(truncate=False)
+-------------------------+
|date |
+-------------------------+
|2020-01-20 07:41:21.86754|
|2020-01-20 07:41:21.86999|
+-------------------------+
test_res = test_df.withColumn("timestamp",F.to_timestamp(F.col('date')))
test_res.show(truncate=False)
+-------------------------+-------------------------+
|date |timestamp |
+-------------------------+-------------------------+
|2020-01-20 07:41:21.86754|2020-01-20 07:41:21.86754|
|2020-01-20 07:41:21.86999|2020-01-20 07:41:21.86999|
+-------------------------+-------------------------+
如您所见,将字符串转换为时间戳没有错误。我将它与 spark 2.4.0 一起使用。 检查结果的dtypes
test_res.dtypes
[('date', 'string'), ('timestamp', 'timestamp')]
我仍然对你的意图很感兴趣。当您必须通过将时间戳转换为 unix_timestamp 来处理时间戳时,即使毫秒(或在您的情况下为微秒)不同,您将获得两行相同的值
test_res1=test_res.withColumn("unix_time",F.unix_timestamp('date'))
test_res1.show(truncate=False)
+-------------------------+-------------------------+----------+
|date |timestamp |unix_time |
+-------------------------+-------------------------+----------+
|2020-01-20 07:41:21.86754|2020-01-20 07:41:21.86754|1579502481|
|2020-01-20 07:41:21.86999|2020-01-20 07:41:21.86999|1579502481|
+-------------------------+-------------------------+----------+
当您尝试将时间戳转换为 int 时,结果相同
test_longint = test_res1.withColumn("test_int",F.col('timestamp').cast('int'))
test_longint.show()
+--------------------+--------------------+----------+----------+
| date| timestamp| unix_time| test_int|
+--------------------+--------------------+----------+----------+
|2020-01-20 07:41:...|2020-01-20 07:41:...|1579502481|1579502481|
|2020-01-20 07:41:...|2020-01-20 07:41:...|1579502481|1579502481|
+--------------------+--------------------+----------+----------+
希望这会有所帮助。如果我更了解您的需求,我可以解释更多。
【讨论】:
以上是关于来自 Hive 的 Pyspark 数据中带有毫秒 'YYYY-MM-DD hh:mm:ss.SSS' 的日期的主要内容,如果未能解决你的问题,请参考以下文章
在 Hive-S3 表的情况下,pyspark 命令行中的错误