我试图从时间戳字段中获取以毫秒(13位数)为单位的unix时间,但目前它以秒(10位数)为单位返回。
scala> var df = Seq("2017-01-18 11:00:00.000", "2017-01-18 11:00:00.123", "2017-01-18 11:00:00.882", "2017-01-18 11:00:02.432").toDF()
df: org.apache.spark.sql.DataFrame = [value: string]
scala> df = df.selectExpr("value timeString", "cast(value as timestamp) time")
df: org.apache.spark.sql.DataFrame = [timeString: string, time: timestamp]
scala> df = df.withColumn("unix_time", unix_timestamp(df("time")))
df: org.apache.spark.sql.DataFrame = [timeString: string, time: timestamp ... 1 more field]
scala> df.take(4)
res63: Array[org.apache.spark.sql.Row] = Array(
[2017-01-18 11:00:00.000,2017-01-18 11:00:00.0,1484758800],
[2017-01-18 11:00:00.123,2017-01-18 11:00:00.123,1484758800],
[2017-01-18 11:00:00.882,2017-01-18 11:00:00.882,1484758800],
[2017-01-18 11:00:02.432,2017-01-18 11:00:02.432,1484758802])
即使2017-01-18 11:00:00.123
和2017-01-18 11:00:00.000
不同,我也会得到相同的unix时间返回1484758800
我错过了什么?
6条答案
按热度按时间gr8qqesn1#
以分数部分时间戳格式隐藏毫秒
试试看:
您将得到类似于1484758800.792的结果,其中792表示毫秒
至少它对我有用(Scala、Spark、Hive)
6ioyuze22#
实施Dao Thi's answer中建议的方法
输出量:
正在将字符串时间格式(包括毫秒)转换为unix_timestamp(双精度)。使用子字符串方法(start_position = -7,length_of_substring=3)从字符串中提取毫秒,并将毫秒分别添加到unix_timestamp。(将子字符串转换为浮点以便添加)
在Spark中将unix_timestamp(双精度)转换为timestamp数据类型。
这将为您提供以下输出
检查架构:
x6492ojm3#
unix_timestamp()
以秒为单位返回Unix时间戳。时间戳中的最后3位数字与毫秒字符串(
1.999sec = 1999 milliseconds
)的最后3位数字相同,因此只需将时间戳字符串的最后3位数字附加到毫秒字符串的末尾。ni65a41a4#
unix_timestamp()无法实现这一点,但Spark 3.1.0提供了一个名为unix_米利斯()的内置函数:
unix_米利斯(时间戳)-返回自1970-01-01 00:00:00 UTC以来的毫秒数。截断更高级别的精度。
brtdzjyr5#
在Spark 3.0.1版之前,无法使用SQL内置函数
unix_timestamp
将时间戳转换为Unix时间(毫秒)。根据Spark的DateTimeUtils上的代码
时间戳在外部显示为
java.sql.Timestamp
,在内部存储为longs
,它们能够以微秒精度存储时间戳。因此,如果您定义一个UDF,并将
java.sql.Timestamp
作为输入,则可以调用getTime
以获得以毫秒为单位的Long。如果您应用unix_timestamp
,则只能获得以秒为单位的精度的unix时间。将此应用于各种时间戳:
pcrecxhr6#
哇,和@@@@@一样,只是投了它