Apache spark 在pyspark中将Unix(历元)时间更改为本地时间
我在Spark中有一个数据帧,其中包含Unix(历元)时间和时区名称。我希望根据不同的tz名称将epochtime转换为本地时间。 以下是我的数据的外观: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 =
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|
+----------+-------------------+-------------------+---------------------+
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()
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