Apache DrillでネストしたJSONを検索してみる

草薙さんの以下のエントリを参考にやってみました。

nagix.hatenablog.com

データソースとなるJSONは以下のような感じだとします。

{ "user": { "name": "takezoe", "mail": "takezoe@gmail.com" } }
...

ちょっと面倒ですが、以下のような感じでネストしたプロパティをカラムとして扱うことができます。

SELECT 
  T.`user`.name AS name,
  T.`user`.mail AS mail
FROM dfs.`/tmp/users.json` T
WHERE T.`user`.name = 'takezoe';

配列のプロパティをレコードに展開したりすることもできるようですが、複雑な構造のJSONだと結構面倒なことになりそうです。複数のテーブルに正規化しなくても扱えるという意味では手軽なのですが、やはりJSONのように構造化されたデータを表として扱うのは若干無理があるような気がします。

ちなみに上記のクエリをjqで書くとこんな感じになります。

$ cat users.json | jq '.user | select(.name == "takezoe")'

もちろんDrillは他のテーブルとの結合や、複雑な条件で検索や集計を行うことができたり、その気になればローカルでは扱いきれないような巨大なデータを扱うことができたりといったメリットがあるのですが、この程度の用途であればjq使ったほうが簡単ですねw