【问题标题】:How can I read in timestamps using spark, save to hive, and have them display correctly?如何使用 spark 读取时间戳、保存到 hive 并让它们正确显示?
【发布时间】:2023-03-15 06:52:01
【问题描述】:

我有一堆带有时间戳列的记录,字符串形式如下所示:

+---------------------+
|         raw         |
+---------------------+
| 2019-07-14 00:00:00 |
| 2019-07-04 00:00:00 |
| 2019-01-26 00:00:00 |
+---------------------+

如果我使用.withColumn("timestamp", to_timestamp(Col("raw"))),并使用STRING, TIMESTAMP 模式写入配置单元,那么我们会看到:

+---------------------+---------------------+
|         raw         |      timestamp      |
+---------------------+---------------------+
| 2019-07-14 00:00:00 | 2019-07-14 00:00:00 |
| 2019-07-04 00:00:00 | 2019-07-04 00:00:00 |
| 2019-01-26 00:00:00 | 2019-01-26 00:00:00 |
+---------------------+---------------------+

但是我们想要指定源时区的选项,所以如果我们将 to_timestamp 替换为 to_utc_timestamp (如.withColumn("timestamp", to_utc_timestamp(Col("raw"), "America/New_York"))),那么我们会得到一个这样的表,有 5 小时的差异:

+---------------------+---------------------+
|         raw         |      timestamp      |
+---------------------+---------------------+
| 2019-07-14 00:00:00 | 2019-07-14 05:00:00 |
| 2019-07-04 00:00:00 | 2019-07-04 05:00:00 |
| 2019-01-26 00:00:00 | 2019-01-26 05:00:00 |
+---------------------+---------------------+

但是有数据的服务器和hive服务器在东部时区,所以我们不应该看到0小时差的时间戳吗?
我的问题是,如何将时间戳从字符串加载到具有特定时区的配置单元,并让它在配置单元中正确显示?

【问题讨论】:

  • 这能回答你的问题吗? Local Time Convert To UTC Time In Hive
  • 不是真的,你具体指的是什么?
  • 我指的是to_utc_timestamp给定时区中的时间戳转换为UTC。因此,如果您说您的时间戳在“America/New_York”,那么 +5 小时就是它在 UTC 中的时间。

标签: scala apache-spark hive


【解决方案1】:

代码不会引用您的数据/配置单元服务器所在的位置。 在您制作的示例中:

 .withColumn("timestamp", to_utc_timestamp(Col("raw"), "America/New_York"))

这实际上意味着我有时间戳列,我想将它转换为 UTC, 然后你指定你的时间戳列应该引用的时区。

让我们以 2019-07-14 00:00:00 为例,如果时间戳列 areazone 是 America/New_York,你实际上是说给我这个 UTC 时间戳列,所以如果纽约的时间现在是 00:00,UTC 时间是 05:00(因为纽约是 UTC -5)。

【讨论】:

  • hive 服务器和 Hadoop 集群在同一个时区,EST。我的理由是,如果我将to_utc_timestamp"America/New_York" 一起使用,那么它应该将2019-07-14 00:00:00 -> UTC 时间与EST 区域一起转换。然后由于配置单元服务器是 EST,它应该显示为 2019-07-14 00:00:00 因为时区匹配(在列和服务器上),对吧?
猜你喜欢
  • 2012-01-06
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 2016-12-09
  • 2014-06-23
相关资源
最近更新 更多