Apache spark 在pyspark中将Unix(历元)时间更改为本地时间

Apache spark 在pyspark中将Unix(历元)时间更改为本地时间,apache-spark,timezone,pyspark,pyspark-sql,epoch,Apache Spark,Timezone,Pyspark,Pyspark Sql,Epoch,我在Spark中有一个数据帧,其中包含Unix(历元)时间和时区名称。我希望根据不同的tz名称将epochtime转换为本地时间。 以下是我的数据的外观: data = [ (1420088400, 'America/New_York'), (1420088400, 'America/Los_Angeles'), (1510401180, 'America/New_York'), (1510401180, 'America/Los_Angeles')] df =

我在Spark中有一个数据帧,其中包含Unix(历元)时间和时区名称。我希望根据不同的tz名称将epochtime转换为本地时间。 以下是我的数据的外观:

data = [
    (1420088400, 'America/New_York'),
    (1420088400, 'America/Los_Angeles'),
    (1510401180, 'America/New_York'),
    (1510401180, 'America/Los_Angeles')]

df = spark.createDataFrame(data, ["epoch_time", "tz_name"])

df.createOrReplaceTempView("df")
df1 = spark.sql("""select *, from_unixtime(epoch_time) as gmt_time,"
               from_utc_timestamp(from_unixtime(epoch_time), tz_name) as local_time"
               from df""")
df1.show(truncate= False)
结果如下:

+----------+-------------------+-------------------+---------------------+
|epoch_time|tz_name            |gmt_time           |local_time           |
+----------+-------------------+-------------------+---------------------+
|1420088400|America/New_York   |2015-01-01 05:00:00|2015-01-01 00:00:00.0|
|1420088400|America/Los_Angeles|2015-01-01 05:00:00|2014-12-31 21:00:00.0|
|1510401180|America/New_York   |2017-11-11 11:53:00|2017-11-11 06:53:00.0|
|1510401180|America/Los_Angeles|2017-11-11 11:53:00|2017-11-11 03:53:00.0|
+----------+-------------------+-------------------+---------------------+
  • 我不太确定这种转移是否正确,但似乎夏令时已经解决了问题
  • 我是否应该首先使用from_unixtime将epochtime更改为时间字符串,然后使用to_utc_timestamp将其更改为utc时间戳,最后使用tz_名称将此utc时间戳更改为本地时间?尝试此操作,但出现错误

    df2 = spark.sql("""select *, from_unixtime(epoch_time) as gmt_time,
                       from_utc_timestamp(from_unixtime(epoch_time), tz_name) as local_time,
                       from_utc_timestamp(to_utc_timestamp(from_unixtime(epoch_time),from_unixtime(unix_timestamp(), 'z')), tz_name) as newtime from df""")
    
  • 如何检查我的EMR服务器时区

  • spark.sql("select from_unixtime(unix_timestamp(), 'z')").show()
    
  • 尝试使用,这是服务器时区吗

    spark.sql("select from_unixtime(unix_timestamp(), 'z')").show()
    
    这给了我:

    +--------------------------------------------------------------------------+
    |from_unixtime(unix_timestamp(current_timestamp(), yyyy-MM-dd HH:mm:ss), z)|
     +--------------------------------------------------------------------------+
    |                                                                       UTC|
    +--------------------------------------------------------------------------+
    

  • 感谢您的澄清。

    当您从_unixtime调用
    时,它将根据Java运行时的时区设置日期格式,因为它只是使用
    SimpleDataFormat
    的默认时区。你的情况是UTC。因此,当您将这些值转换为本地时间时,您只需使用传入的
    tz\u name
    值从utc\u timestamp
    调用
    。但是,如果要更改系统时区,则需要先调用
    以_utc_timestamp

    Spark 2.2引入了时区设置,因此您可以像这样设置SparkSession的时区

    spark.conf.set("spark.sql.session.timeZone", "GMT")
    

    在这种情况下,时间函数将使用
    GMT
    与您的系统时区比较,请参阅来源错误是什么?对我来说很好。你用的是什么版本的Spark?Spark 2.0。我在EMR控制台上检查过,那里的区域是us-east-1。如何检查服务器时区名称?您知道spark.sql(“select from_unixtime(unix_timestamp(),'z')”)“z”代表什么吗?谢谢您的回答,它解释了我遗漏的部分内容。为什么我从控制台检查EMR服务器它是us-east-1区域,但从spark.sql(“从unix\u timestamp(),'z')”)选择。show()它是UTC?如果我为我的SparkSession设置了时区,那是否只会在我当前的Spark会话中设置?如果我在代码中停止此会话,当我启动另一个会话时,是否需要再次设置它?谢谢。您可以在spark配置中设置它,例如,对于spark shell使用
    --conf spark.sql.session.timeZone=GMT