我正在使用 gzip 压缩的 JSON 编码文件在 Amazon 的 Elastic MapReduce 上创建 Hive 表。我正在使用这个 JSON SerDe:http ://code.google.com/p/hive-json-serde/
未编码的文件如下所示:
{"id":"101", "items":"A:231,234,119,12"}
{"id":"102", "items":"B:13,89,121"}
...
我想为具有表格生成功能的用户创建一个“项目”列的数组。我想要的数组是整数的“爆炸”CSV,忽略“:”和它之前的字母。我希望能够对项目整数(231,234 等)进行 GROUP BY 或将它们与其他表相结合。改变这个文件的格式会很困难,我所有的旧数据都以这种格式存储,所以我想在 Hive 中解决这个问题,而不改变如何存储我的数据。
我有办法做到这一点吗?
编辑:
谢谢@mark-grover,这行得通!
我做了这样的事情:
SELECT id, item FROM my_table LATERAL VIEW explode(split(substr(items, 3, length(items) - 2), ',')) t1 AS item
要得到:
101 231
101 234
101 119
101 12
102 13
102 89
102 121
在这样做的过程中,我发现我想做更多的事情。我还想选择每个项目在 CSV 中的位置。所以我希望输出看起来像:
101 231 0
101 234 1
101 119 2
101 12 3
102 13 1
102 89 2
102 121 3
这里有什么想法吗?
再次编辑:
我为我的后续问题提出了一些类似的问题:
SELECT id, item, find_in_set(item, substr(items, 3, length(items) - 2)) AS position
FROM my_table LATERAL VIEW explode(split(substr(items, 3, length(items) - 2), ',')) t1 AS item