我在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)
我应该首先使用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|
+----------+-------------------+-------------------+---------------------+
如何查看我的EMR服务器时区?
尝试使用,这是服务器时区吗?
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()
感谢您的澄清。
答案 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