最近在用PySpark做ETL,然后发现了Spark存在的时区问题。
Mysql的时区默认是CST格式, 但是Spark默认的是GMT格式,因此直接使用Spark读取Mysql的时间时,会被转为GMT格式,对于这个问题,只需要设置spark.sql.session.timeZone为CST就可以解决了,但由此由引发了一个新的问题。
当两者都是CST的时候,将时间转为yyyy-MM-dd hh:mm:ss来看时,两者是相同的,问题在于分别使用unix_timestamp转为时间戳的时候,两个时间戳之间会相差14 * 3600 秒!并且我尝试了在Spark各种设置都没办法达到两者一致,最终确定出来,当Mysql是CST时,Spark展示出来的数据,要么时间戳跟时间格式都跟Mysql对不上,要么就是时间格式对上了,但是时间戳对不上。。。要解决这个问题,目前已知的唯一办法是将Mysql的时区设置为其它格式,但是,生产中不一定能采用此种方法。
个人猜测是因为CST本身含有4个含义导致的,其中一个是美国标准时间,即UTC-06:00,一个是中国标准时间,即UTC+08:00,两者相差刚好14小时,Mysql解读为中国标准时间,而Spark解读为美国标准时间。
顺便说明一下在捣鼓这个问题时发现的其它点:
- Spark在2.4版本,传入时区时,只能传"UTC","GMT"等,不能传
(+|-) hh:mm这种偏移量,偏移量我已知的是在3.0版本才能生效。3.0版本虽说可以传入"area/city"这种作为时区,但对于上海并不生效。 - PySpark DataFrame的DSL风格的
date_format在功能上远比Mysql的要少;
顺带一下area/city的数据:
Etc/GMT+12
Etc/GMT+11
MIT
Pacific/Apia
Pacific/Midway
Pacific/Niue
Pacific/Pago_Pago
Pacific/Samoa
US/Samoa
America/Adak
America/Atka
Etc/GMT+10
HST
Pacific/Fakaofo
Pacific/Honolulu
Pacific/Johnston
Pacific/Rarotonga
Pacific/Tahiti
SystemV/HST10
US/Aleutian
US/Hawaii
Pacific/Marquesas
AST
America/Anchorage
America/Juneau
America/Nome
America/Yakutat
Etc/GMT+9
Pacific/Gambier
SystemV/YST9
SystemV/YST9YDT
US/Alaska
America/Dawson
America/Ensenada
America/Los_Angeles
America/Tijuana
America/Vancouver
America/Whitehorse
Canada/Pacific
Canada/Yukon
Etc/GMT+8
Mexico/BajaNorte
PST
PST8PDT
Pacific/Pitcairn
SystemV/PST8
SystemV/PST8PDT
US/Pacific
US/Pacific-New
America/Boise
America/Cambridge_Bay
America/Chihuahua
America/Dawson_Creek
America/Denver
America/Edmonton
America/Hermosillo
America/Inuvik
America/Mazatlan
America/Phoenix
America/Shiprock
America/Yellowknife
Canada/Mountain
Etc/GMT+7
MST
MST7MDT
Mexico/BajaSur
Navajo
PNT
SystemV/MST7
SystemV/MST7MDT
US/Arizona
US/Mountain
America/Belize
America/Cancun
America/Chicago
America/Costa_Rica
America/El_

在PySpark处理ETL过程中遇到Spark与MySQL时间戳相差14小时的问题,原因是Spark默认时区为GMT,而MySQL默认为CST。尽管设置时区可使时间格式相同,但在转换为时间戳时仍存在差异。尝试多种Spark设置未果,可能由于CST在不同环境中有不同解释。目前解决方案是调整MySQL时区,但这在生产环境中可能不可行。另外,发现Spark 2.4版本不支持偏移量时区设置,3.0版本才开始支持,且对'上海'这样的时区设置无效。
最低0.47元/天 解锁文章
633

被折叠的 条评论
为什么被折叠?



