gpt4 book ai didi

amazon-web-services - JDBC读/写中的 Spark 时间戳时区

转载 作者:行者123 更新时间:2023-12-03 23:50:44 25 4
gpt4 key购买 nike

我正在通过从 oracle 读取数据来创建 Parquet 文件。

Oracle 在 UTC 中运行。我确认使用,

SELECT DBTIMEZONE FROM DUAL;

输出:
DBTIMEZONE|
----------|
+00:00 |

从 JDBC 读取并作为 parquet 写入 S3:
df = spark.read.format('jdbc').options(url=url,
dbtable=query,
user=user,
password=password,
fetchsize=2000).load()

df.write.parquet(s3_loc, mode="overwrite")

现在,我检查了 spark.sql.session.timeZone 的值
print(spark.conf.get("spark.sql.session.timeZone"))

输出:
UTC

现在,我正在从 S3 位置读取数据:
df1 = spark.read.parquet(s3_loc)
df1.show()

输出:
+-------------------+
| col1 |
+-------------------+
|2012-11-11 05:00:00|
|2013-11-25 05:00:00|
|2013-11-11 05:00:00|
|2014-12-25 05:00:00|
+-------------------+
col1是oracle中的日期并转换为spark df中的时间戳。

为什么在输出中添加了 5 小时? 数据库以 UTC 和 spark.sql.session.timeZone 运行是UTC。

笔记:
  • RDS 和 EMR 都在 AWS US-EAST-1 中运行
  • 在所有 Spark 节点上,我运行了 TZ=UTC
  • 最佳答案

    时区由JDBC驱动程序识别,它不知道Spark的时区设置,而是依赖于JVM的默认时区。此外,它会忽略远程数据库 session 的时区设置。你说你跑了TZ=UTC - 我不确定,但可能没用。检查什么 TimeZone.getDefault告诉你。

    如果我怀疑您的 JVM 时区是 EDT(US-EAST-1 是弗吉尼亚州),那么 2012-11-11 00:00:00 JDBC 从 Oracle 读取的数据被解释为 EDT。在 Spark 中显示它是 2012-11-11 05:00:00 UTC,这是你得到的结果。

    要修复它,请在运行 spark-submit 时覆盖 JVM 默认时区:

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

    关于amazon-web-services - JDBC读/写中的 Spark 时间戳时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58264005/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com