PySpark在AWS Glue中写入Kafka时的时区偏移问题求助
解决Spark/Glue中Kafka写入时的时区偏移问题
这个问题的核心在于**to_json函数和Spark的JSON文件Writer遵循的时区规则不一样**:虽然你已经通过--conf spark.sql.session.timeZone=Europe/Paris设置了会话时区,但to_json默认会用UTC来序列化Timestamp类型字段,而JSON文件Writer会遵循会话时区,这就是两种输出日期不一致的原因。
下面是几个可行的解决办法,按推荐程度排序:
1. 直接在to_json中指定时区(最灵活)
不需要修改全局配置,只针对当前的JSON序列化操作指定时区。修改你的selectExpr代码,给to_json传入时区选项:
data_frame.selectExpr( "CAST(id AS STRING) AS key", "to_json(struct(metadata,payload), map('timeZone', 'Europe/Paris')) AS value" ).write.format("kafka")
这样to_json会用巴黎时区处理Timestamp类型字段,输出的日期就和JSON文件的结果一致了。
2. 全局设置JSON生成器的时区(适合多场景使用)
如果你的任务中有多处使用to_json操作,可以在Glue的配置里添加额外参数,全局指定JSON序列化的时区:
--conf spark.sql.jsonGenerator.timeZone=Europe/Paris
这个参数会让所有to_json函数默认使用巴黎时区,无需每次单独设置。
3. 提前将日期转成字符串类型(彻底规避时区问题)
既然你已经通过date_format把日期转成了yyyy-MM-dd HH:mm:ss格式的字符串,确保这个字段在payload中保持String类型,而非Timestamp类型。这样to_json序列化时会直接使用该字符串,不会再进行任何时区转换操作。
你可以检查数据转换流程,确认receipt_date最终是String类型,没有被后续操作转回Timestamp。
内容的提问来源于stack exchange,提问作者Smaillns
相关产品推荐
相关产品推荐

