【问题标题】:Why timestamp columns in Spark dataframe changed during write to Hive table?为什么 Spark 数据框中的时间戳列在写入 Hive 表期间发生了变化?
【发布时间】:2022-01-23 01:22:12
【问题描述】:

我正在尝试使用 JDBC 读取 Oracle 表并将数据插入 Hive 表,但所有时间戳列的值都已更改(-6 小时)。为什么它会更改时间戳?

我尝试使用“spark.sql.session.timeZone”、“UTC”来触发配置,但没有帮助

val spark: SparkSession = SparkSession
      .builder
      .config(sparkConf)
      .config("spark.sql.session.timeZone", "UTC")
      .enableHiveSupport()
      .getOrCreate()

val dataDF = spark.read.format("jdbc")
    .option("driver", "oracle.jdbc.OracleDriver")
    .option("url", s"jdbc:oracle:thin:@//${configuration("dwh_address")}")
    .option("user", configuration("dwh_username"))
    .option("password", configuration("dwh_password"))
    .option("dbtable", s"(${select * from source_table})")
    .option("fetchSize", configuration("fetch_size"))
    .load()

dataDF.coalesce(1).write.mode("append").insertInto("target_table")


这是表中源行的样子:

ID        DATE

1509808,   2019-11-04 00:00:00.0

这是插入后 Hive 表的样子:

ID        DATE

1509808,   2019-11-03 18:00:00.0

我不知道为什么所有 TIMESTAMP 列都更改为 - 6 HOURS 并希望有人已经遇到过这样的问题?

【问题讨论】:

    标签: scala apache-spark hive


    【解决方案1】:

    我认为 Spark 中的 TIMESTAMP 列是 DateType。将配置 "spark.sql.session.timeZone" 设置为 "UTC" 仅在将时间戳格式化为字符串时有一些效果,但日期将保存在 Date 对象中,其中时区无关紧要。

    如果您想再次以 UTC 访问它,您可以获取时间戳并将其转换或使用“spark.sql.session.timeZone”来更改默认时间戳时区。

    【讨论】:

      【解决方案2】:

      对于这个问题,请检查您的源时间戳是否在哪个时区。因此,您可以使用下面的方法覆盖时区,它将时间转换回您的原始时间戳

      如果您的源时间戳在 MST 中,请在下面使用:

      --conf spark.sql.session.timeZone=MST

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-09
        • 2019-03-01
        • 2019-04-23
        • 2022-01-06
        • 2022-06-29
        • 2019-05-09
        • 2019-01-23
        相关资源
        最近更新 更多