Hive 为非 'yyyy-MM-dd HH:mm:ss' 格式的时间戳创建 table 语句
Hive create table statement for timestamps that aren't in a 'yyyy-MM-dd HH:mm:ss' format
我在 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
.
我能够创建 table,前提是我将时间戳列视为字符串:
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_DIFF
、DATE_ADD
等)的能力,而无需从内部强制转换查询。一种可能的解决方法是 CTAS and CAST the timestamp using a regular expression,但这需要将数据复制为其新格式。这似乎效率低下并且不符合 'schema-on-read'.
的精神
有没有一种方法可以为该数据创建一个架构而无需处理数据两次(即一次加载,一次将时间戳转换为真正的时间戳)?
您需要决定是否:
- 按照您的描述进行 CTAS
- 将转换 work/logic 推送到 table
的 consumers/clients
对于第二个选项,这意味着在针对外部 table.
执行的 sql 语句中包括字符串到时间戳的转换
我在 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
.
我能够创建 table,前提是我将时间戳列视为字符串:
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_DIFF
、DATE_ADD
等)的能力,而无需从内部强制转换查询。一种可能的解决方法是 CTAS and CAST the timestamp using a regular expression,但这需要将数据复制为其新格式。这似乎效率低下并且不符合 'schema-on-read'.
有没有一种方法可以为该数据创建一个架构而无需处理数据两次(即一次加载,一次将时间戳转换为真正的时间戳)?
您需要决定是否:
- 按照您的描述进行 CTAS
- 将转换 work/logic 推送到 table 的 consumers/clients
对于第二个选项,这意味着在针对外部 table.
执行的 sql 语句中包括字符串到时间戳的转换