如何强制 avro writer 在 spark scala 数据帧中以 UTC 格式写入时间戳

how to force avro writer to write timestamp in UTC in spark scala dataframe

我需要将时间戳字段写入 avro 并确保数据以 UTC 格式保存。目前 avro 将其转换为服务器本地时区中的长(时间戳 millis),这会导致问题,就好像读取 bk 的服务器是不同的时区一样。我查看了 DataFrameWriter,它似乎提到了一个名为 timeZone 的选项,但似乎 help.Is 没有办法强制 Avro 考虑在特定时区收到的所有时间戳字段?

**CODE SNIPPET** 
--write to spark avro

val data = Seq(Row("1",java.sql.Timestamp.valueOf("2020-05-11 15:17:57.188")))
val schemaOrig = List( StructField("rowkey",StringType,true)
,StructField("txn_ts",TimestampType,true))
val sourceDf =  spark.createDataFrame(spark.sparkContext.parallelize(data),StructType(schemaOrig))
sourceDf.write.option("timeZone","UTC").avro("/test4")

--now try to read back from avro
spark.read.avro("/test4").show(false)
avroDf.show(false)

original value in soure 2020-05-11 15:17:57.188
in avro  1589224677188
read bk from avro wt out format 
+-------------+-------------+
|rowkey       |txn_ts       |
+-------------+-------------+
|1            |1589224677188|
+-------------+-------------+

This is mapping fine but issue is if the local time of the server writing is EST and the one reading back is GMT it would give problem . 

println(new java.sql.Timestamp(1589224677188L))
2020-05-11 7:17:57.188   -- time in GMT

.option("timeZone","UTC") 选项不会将时间戳转换为 UTC 时区。

设置此 spark.conf.set("spark.sql.session.timeZone", "UTC") 配置 属性 以将 UTC 设置为所有时间戳的默认时区。

如果未设置,spark.sql.session.timeZone 属性 的默认值为 JVM 系统本地时区。

Incase 如果由于较低版本的 spark 而导致上述选项不起作用,请尝试使用以下选项。

--conf "spark.driver.extraJavaOptions=-Duser.timezone=UTC" --conf "spark.executor.extraJavaOptions=-Duser.timezone=UTC"