mm-dd hh:mm:ss.sss'

ssm49v7z  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(359)

在配置单元表中,有一个日期字段以字符串形式存储,格式如下:

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日期框中,以执行转换。
什么是正确的方法来查询和提取存储为字符串的日期?

qeeaahzv

qeeaahzv1#

在我开始之前,有一个关于时间格式的问题。为什么毫秒值是-86754?那意味着86秒754毫秒?你是说微秒?那就说得通了。
不管怎样,我试着用同样的日期格式来检查spark是否能处理它,它确实能。
考虑一个测试Dataframe

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中使用了这个。检查结果的数据类型

test_res.dtypes
[('date', 'string'), ('timestamp', 'timestamp')]

我仍然对你的意图感兴趣。当您必须处理时间戳时,例如通过将其转换为unix\u时间戳,您将获得两行相同的值,即使毫秒(在您的情况下是微秒)不同

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|
+--------------------+--------------------+----------+----------+

希望这有帮助。如果我知道你需要什么,我可以解释更多。

相关问题