CUBE SUGAR CONTAINER

技術系のこと書きます。

Apache Hive で SELECT した結果から ARRAY を作る

Apahe Hive を使っていて、テーブルから SELECT してきた結果から ARRAY 型のカラムを作る方法が分からなくて調べた。 結論から先に述べると COLLECT_LIST() を使えば良い。

使った環境は次の通り。

$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core) 
$ uname -r
3.10.0-862.3.2.el7.x86_64
$ hive --version
Hive 2.3.3
Git git://daijymacpro-2.local/Users/daijy/commit/hive -r 8a511e3f79b43d4be41cd231cf5c99e43b248383
Compiled by daijy on Wed Mar 28 16:58:33 PDT 2018
From source with checksum 8873bba6c55a058614e74c0e628ab022
$ hadoop version
Hadoop 2.9.1
Subversion https://github.com/apache/hadoop.git -r e30710aea4e6e55e69372929106cf119af06fd0e
Compiled by root on 2018-04-16T09:33Z
Compiled with protoc 2.5.0
From source with checksum 7d6d2b655115c6cc336d662cc2b919bd
This command was run using /home/vagrant/hadoop-2.9.1/share/hadoop/common/hadoop-common-2.9.1.jar

ARRAY 型について

以前、このブログで ARRAY 型について書いたことがある。 ただ、この記事では SELECT してきた結果から ARRAY を作る方法については扱わなかった。

blog.amedama.jp

上記の記事にあるけど Apache Hive における ARRAY 型というのは、公式にジェイウォークをするための方法という感じ。 使うと一行のレコードに複数行の情報を詰め込むことができる。 Apache Hive はアーキテクチャ的に JOIN の処理が割と苦手なので、こういう機能を使う必要が出てくることもある。

下準備

まずは Hive のシェルを起動しておく。

$ hive

動作確認用のテーブルとして、名前 (name) と性別 (gender) の入るテーブル (users) を作っておく。

hive> CREATE TABLE users (
    >   name STRING,
    >   gender STRING
    > );
OK
Time taken: 0.06 seconds

適当な名前と性別でユーザを追加する。

hive> INSERT INTO TABLE users
    > VALUES
    >   ('alice', 'female'),
    >   ('bob', 'male'),
    >   ('carol', 'female');
...
OK
Time taken: 19.046 seconds

これで準備ができた。

SELECT した結果から ARRAY を作ってみる

ユーザを性別 (gender) で集計した上で、名前 (name) も一緒に確認したいという状況で考えてみよう。 この場合、性別と一緒に名前が ARRAY で得られると嬉しい。

この場合 GROUP BY に gender を指定した上で COLLECT_LIST() を使う。

hive> SELECT
    >   gender,
    >   COLLECT_LIST(name) AS names
    > FROM users
    > GROUP BY gender;
...
OK
female  ["alice","carol"]
male    ["bob"]
Time taken: 25.689 seconds, Fetched: 2 row(s)

見事、性別とそれに該当する名前が ARRAY で得られた。

ちなみに、COLLECT_LIST() から得られる結果は重複を許す。 もし、重複を許さない結果がほしいときは COLLECT_SET() を使えば良い。

プログラミング Hive

プログラミング Hive

  • 作者: Edward Capriolo,Dean Wampler,Jason Rutherglen,佐藤直生,嶋内翔,Sky株式会社玉川竜司
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2013/06/15
  • メディア: 大型本
  • この商品を含むブログ (3件) を見る