3

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
4

1 に答える 1