我有一个数据集,其中1列是代表毫秒的long
。我想获取此数字在 UTC 中表示的时间戳(yyyy-MM-dd HH:mm:ss
)。基本上我想要的行为与https://currentmillis.com/
我的问题是,有没有一种方法可以让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中部署此函数,而无需在每个函数中编写特定于语言的代码。
答案 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|
+-------------+-------------------+