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"}
...
テーブル生成関数を使用して、ユーザーの「アイテム」列の配列を作成したいと思います。必要な配列は、「:」とその前の文字を無視した int の「分解された」CSV です。項目 int (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