Hive
参考文献
- https://cwiki.apache.org/confluence/display/hive/Languagemanual+udf
トイデータを定義する
各データを配列として定義し、さらに全データを配列に束ね、LATERAL VIEW で各データを各レコードに展開し、インデックスで各列の値をとっているだけである。
WITH tenki AS (
SELECT
data[0] AS toshi,
data[1] AS tenki1,
data[2] AS tenki2,
data[3] AS tenki3
FROM
(
SELECT
ARRAY(
ARRAY("札幌", "晴", "雪", "晴"),
ARRAY("東京", "晴", "曇", "曇"),
ARRAY("京都", "曇", "雪", "晴")
) AS data_
) x
LATERAL VIEW EXPLODE(data_) lv AS data
)
SELECT * FROM tenki;
+--------------+---------------+---------------+---------------+--+
| tenki.toshi | tenki.tenki1 | tenki.tenki2 | tenki.tenki3 |
+--------------+---------------+---------------+---------------+--+
| 札幌 | 晴 | 雪 | 晴 |
| 東京 | 晴 | 曇 | 曇 |
| 京都 | 曇 | 雪 | 晴 |
+--------------+---------------+---------------+---------------+--+
各レコードの V1~V3 列の値のユニークセットをとる
COLLECT_SET は aggregate function なので、V1~V3 列を同名の列にしておいて aggregate する必要がある。
SELECT
toshi,
COLLECT_SET(tenki0)
FROM
(
SELECT toshi, tenki1 AS tenki0 FROM tenki
UNION ALL
SELECT toshi, tenki2 AS tenki0 FROM tenki
UNION ALL
SELECT toshi, tenki3 AS tenki0 FROM tenki
) x
GROUP BY
toshi
;
+--------+------------------+--+
| toshi | _c1 |
+--------+------------------+--+
| 京都 | ["曇","晴","雪"] |
| 札幌 | ["晴","雪"] |
| 東京 | ["晴","曇"] |
+--------+------------------+--+
以下でも同じである。記述量は少ないが Hive にさせている処理は多い。
SELECT
toshi,
COLLECT_SET(tenki0)
FROM
(
SELECT
toshi,
ARRAY(tenki1, tenki2, tenki3) AS tenkis
FROM tenki
) x
LATERAL VIEW EXPLODE(tenkis) lv AS tenki0
GROUP BY
toshi
;
+--------+------------------+--+
| toshi | _c1 |
+--------+------------------+--+
| 京都 | ["曇","雪","晴"] |
| 札幌 | ["晴","雪"] |
| 東京 | ["晴","曇"] |
+--------+------------------+--+
ひらがなをカタカナにする
無理やりである。
SELECT
translate(
'びっぐさんだーまうんてん',
CONCAT(
'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほ',
'まみむめもやゆよらりるれろわゐゑをんゔがぎぐげござじずぜぞ',
'だぢづでどばびぶべぼぱぴぷぺぽぁぃぅぇぉっゃゅょゎ'
),
CONCAT(
'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホ',
'マミムメモヤユヨラリルレロワヰヱヲンヴガギグゲゴザジズゼゾ',
'ダヂヅデドバビブベボパピプペポァィゥェォッャュョヮ'
)
)
;
+---------------+--+
| _c0 |
+---------------+--+
| ビッグサンダーマウンテン |
+---------------+--+