【问题标题】:Hive create table statement for timestamps that aren't in a 'yyyy-MM-dd HH:mm:ss' formatHive 为不是 'yyyy-MM-dd HH:mm:ss' 格式的时间戳创建表语句
【发布时间】:2015-05-16 05:09:40
【问题描述】:

我在 HDFS 中有一个 JSON 数据集,其中包含时间戳和计数。原始数据如下所示:

{"timestamp": "2015-03-01T00:00:00+00:00", "metric": 23}
{"timestamp": "2015-03-01T00:00:01+00:00", "metric": 17}
...

时间戳的格式几乎与 Hive 友好的 'yyyy-mm-dd hh:mm:ss' 格式相匹配,但有一些区别:日期和时间之间有一个 'T'。还有一个时区偏移。例如,时间戳可能是 2015-03-01T00:00:00+00:00 而不是 2015-03-01 00:00:00

我可以创建一个表,前提是我将时间戳列视为字符串:

add jar hdfs:///apps/hive/jars/hive-json-serde-0.2.jar;

CREATE EXTERNAL TABLE `log`(
  `timestamp` string, 
  `metric` bigint)
ROW FORMAT SERDE "org.apache.hadoop.hive.contrib.serde2.JsonSerde" WITH SERDEPROPERTIES ("timestamp"="$.timestamp", "metric"="$.metric")
LOCATION 'hdfs://path/to/my/data';

这并不理想,因为通过将其视为字符串,我们失去了使用时间戳函数(例如 DATE_DIFFDATE_ADD 等)的能力,而无需从查询中进行转换。一种可能的解决方法是使用CTASCAST the timestamp using a regular expression,但这需要将数据复制到其新格式中。这似乎效率低下,不符合“读模式”的精神。

有没有一种方法可以在不处理数据两次(即一次加载,一次将时间戳转换为真正的时间戳)的情况下为该数据创建架构?

【问题讨论】:

    标签: hive


    【解决方案1】:

    您需要决定是否:

    • 按照您的描述执行 CTAS
    • 将转换工作/逻辑推送到表的消费者/客户端中

    对于第二个选项,这意味着在针对您的外部表执行的 sql 语句中包括字符串到时间戳的转换。

    【讨论】:

      猜你喜欢
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 2023-03-04
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多