Spark将毫秒转换为UTC日期时间

时间:2020-04-17 18:07:12

标签: apache-spark pyspark

我有一个数据集,其中1列是代表毫秒的long。我想获取此数字在 UTC 中表示的时间戳(yyyy-MM-dd HH:mm:ss)。基本上我想要的行为与https://currentmillis.com/

enter image description here

我的问题是,有没有一种方法可以让Spark代码将毫秒级的字段转换为UTC的时间戳?我使用本机Spark代码所能获得的就是将那长的时间转换成我的本地时间(EST):

from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql import types as T
from pyspark.sql import functions as F

sc = SparkContext()
spark = SQLContext(sc)

df = spark.read.json(sc.parallelize([{'millis':1582749601000}]))

df.withColumn('as_date', F.from_unixtime((F.col('millis')/1000))).show()

+-------------+-------------------+
|       millis|            as_date|
+-------------+-------------------+
|1582749601000|2020-02-26 15:40:01|
+-------------+-------------------+

通过强制整个Spark会话的时区,我已经能够转换为UTC。不过,我想避免这种情况,因为必须针对该工作中的特定用例更改整个Spark会话时区,这是错误的。

spark.sparkSession.builder.master('local[1]').config("spark.sql.session.timeZone", "UTC").getOrCreate()

我还希望避免使用自定义定义的函数,因为我希望能够在Scala和Python中部署此函数,而无需在每个函数中编写特定于语言的代码。

1 个答案:

答案 0 :(得分:2)

使用 to_utc_timestamp 指定您的时区( EST )。

    from pyspark.sql import functions as F
    df.withColumn("as_date", F.to_utc_timestamp(F.from_unixtime(F.col("millis")/1000,'yyyy-MM-dd HH:mm:ss'),'EST')).show()

    +-------------+-------------------+
    |       millis|            as_date|
    +-------------+-------------------+
    |1582749601000|2020-02-26 20:40:01|
    +-------------+-------------------+