将Unix(Epoch)时间更改为pyspark中的本地时间

时间:2018-01-07 18:07:12

标签: apache-spark timezone pyspark pyspark-sql epoch

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

public static String filenameToClassname(String filename)
{
    filename = filename.substring(0, filename.lastIndexOf(CLASS_FILE_EXTENSION)).replace('/', '.').replace('\\', '.');
    if (filename.startsWith("BOOT-INF.classes."))
        filename = filename.substring(BOOT_INF_CLASSES.length());
    return filename;
}

结果如下:

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)
  1. 我不太确定这种转移是否正确,但似乎夏令时一直在照顾。
  2. 我应该首先使用from_unixtime将epochtime更改为时间字符串,然后使用to_utc_timestamp将其更改为utc timestamp,最后使用tz_name将此UTC时间戳更改为本地时间?试过这个,但得到了错误

    +----------+-------------------+-------------------+---------------------+
    |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|
    +----------+-------------------+-------------------+---------------------+
    
  3. 如何查看我的EMR服务器时区?

  4. 尝试使用,这是服务器时区吗?

    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""")
    

    给了我:

    spark.sql("select from_unixtime(unix_timestamp(), 'z')").show()
    
  5. 感谢您的澄清。

1 个答案:

答案 0 :(得分:3)

当您致电from_unixtime时,它会根据您的Java运行时的时区格式化日期,因为它只使用SimpleDateFormat here的默认时区。在你的情况下它是UTC。因此,当您将值转换为本地时间时,您只需要在传入from_utc_timestamp值的情况下调用tz_name。但是,如果您要更改系统时区,则需要调用{{1}首先。

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

to_utc_timestamp

在这种情况下,时间函数将使用spark.conf.set("spark.sql.session.timeZone", "GMT") 与您的系统时区,请参阅来源here