解析JSON数组(转义字符串)

时间:2015-11-11 02:23:22

标签: json regex hive emr

我是一个完整的Hive noob,尝试使用EMR上的Hive查询解析转义的JSON数组字符串。从我的S3存储桶返回的每一行都是这样的:

["{\"code\": 14468278120, \"book_id\": \"rUkt3UHYyumTy7KCr7T72y\", \"description\": \”fantasyl\"}", "{\"code\": 14468304270, \"book_id\": \"wyyoenAWvmg3HhpZqVQr8i\", \"description\": \”sci fi\”}”, "{\"code\": 14468310080, \"book_id\": \"4UyygAduLhs3qyHTyJLZiD\", \"description\": \”history\”}”, "{\"code\": 14468313170, \"book_id\": \"6KPnPiTBViZJeG3eguUZig\", \"description\": \”architecture\”}”, "{\"code\": 14468313650, \"book_id\": \"U5zAirv3HYvGYANkmb64Yy\", \"description\": \”design\”}”]

到目前为止,任何使用Regex Serde和JSON SerDe从这些字符串中获取任何内容的尝试都会为每行返回NULL。

e.g。这将返回所有NULL

CREATE EXTERNAL TABLE kinesis_flagged (value STRING) 
PARTITIONED BY (dt string)
ROW FORMAT SERDE 'com.amazon.elasticmapreduce.JsonSerde'
WITH SERDEPROPERTIES ('paths'='value') 
LOCATION "s3n://S3_BUCKET_PATH"; 

其他令人尴尬的尝试包括:

CREATE EXTERNAL TABLE kinesis_flagged (value STRING) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' 
WITH SERDEPROPERTIES ( 'input.regex'='\\{\\"code\\": (.+?), \\"book_id\\": \\"(.+?)\\", \\"description\\": \\"(.+?)\\"\\}"' ) 
LOCATION "s3n://S3_BUCKET_PATH"; 

关于我应该怎么做的任何想法?此外,如何创建一个包含列"代码"," book_id"和"说明"?

的表格

1 个答案:

答案 0 :(得分:0)

你不可能在JSON上使用正则表达式取得成功。你应该将其分解为两个任务;

1 - 使用库解析JSON 2 - 根据需要构建表格

除了一些虚假的双引号外,该示例看起来像普通的JSON。首先解决这个问题,否则你的JSON解析器会barf。