【发布时间】:2019-08-01 18:30:53
【问题描述】:
我目前正在创建一个 Athena 表,如下所示:
CREATE EXTERNAL TABLE `foo_streaming`(
`type` string,
`message` struct<a:string,b:string,c:string>)
PARTITIONED BY (
`dt` string)
ROW FORMAT SERDE
'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://foo/data'
但是,我不想将 message 结构体视为结构化数据,而是将其读取为 JSON blob,因为数据随时可能发生变化。我该如何使用 Athena?
我尝试了以下方法,但它给了我一个错误。我尝试谷歌搜索,但一无所获。
CREATE EXTERNAL TABLE `foo_streaming`(
`type` string,
`message` JSON)
PARTITIONED BY (
`dt` string)
ROW FORMAT SERDE
'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS INPUTFORMAT
'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
's3://foo/data'
来自 S3 的样本数据如下:
{ "type": "GTF", "message": { "a": 1, "b": 2 } }
{ "type": "GTB", "message": { "c": 1, "d": 2, "x": { "testid": "abc" } } }
{ "type": "GTE", "message": { "error_code": 1 } }
【问题讨论】:
-
你能发布一些示例 JSON 变化记录吗?
-
嗨@Prabhakar,它看起来像下面这样:
{ "type": "GTF", "message": { "a": 1, "b": 2 } } { "type": "GTB", "message": { "c": 1, "d": 2, "x": { "testid": "abc" } } } { "type": "GTE", "message": { "error_code": 1 } } -
^^ 消息部分可能每次都不一样。
-
我尝试在 jsonlint.com 上验证这是否是有效的 JSON,发现它是无效的 JSON 格式。
-
我发现解决这个问题的唯一方法是重新编写进入 S3 的 JSON,以便每个“类型”生成它自己的唯一名称。感谢大家的帮助。
标签: amazon-athena