Hive0.13とPrestoで配列の順序関係を残して色々処理したい。

  • 3
    Like
  • 0
    Comment
More than 1 year has passed since last update.

クエリのちょっとした書き方。

元のテーブルには、カンマで区切られた文字列が格納している。

num ans
1,4 2,5

この各カラムには対応関係があり、
1 - 2
4 - 5
この対応関係を残して処理したい

つまり、下のようなテーブルが完成できればよい。

num ans
1 2
4 5

Hive 0.10だと難しいが、
Hive 0.13からposexplode関数がある。
これはpositionを保持したまま、配列を展開できる。

SELECT t1.col as num, t2.col as ans
FROM (
SELECT  seq, col  FROM table
LATERAL VIEW posexplode(split('1,4', ',')) rec as seq, col
) t1
JOIN (
SELECT  seq, col  FROM table
LATERAL VIEW posexplode(split('2,5', ',')) rec as seq, col
) t2
ON t1.seq = t2.seq

Prestoではregexp_extract_all関数とUNNESTを使う。

SELECT
 n as num, a as ans
FROM (
  -- record 生成用
  SELECT n1, n2
  FROM (
    VALUES
      ('1,4', '2,5')
  ) AS x (n1, n2)
) t1
CROSS JOIN UNNEST(regexp_extract_all(n1, '[^,]+'), regexp_extract_all(n2, '[^,]+')) AS t (n, a)

ちなみにTreasureDataのPrestoの自動構文チェックではUNNESTを使うとWarningがでるが、
無視して実行してよい。
presto.png