Spark和数据库时间戳相差14小时

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

最近在用PySpark做ETL,然后发现了Spark存在的时区问题。

Mysql的时区默认是CST格式, 但是Spark默认的是GMT格式,因此直接使用Spark读取Mysql的时间时,会被转为GMT格式,对于这个问题,只需要设置spark.sql.session.timeZoneCST就可以解决了,但由此由引发了一个新的问题。

当两者都是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解读为美国标准时间。

顺便说明一下在捣鼓这个问题时发现的其它点:

  1. Spark在2.4版本,传入时区时,只能传"UTC","GMT"等,不能传(+|-) hh:mm这种偏移量,偏移量我已知的是在3.0版本才能生效。3.0版本虽说可以传入"area/city"这种作为时区,但对于上海并不生效。
  2. 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_
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值