Apache Drillはuserに厳しい
mongodbに対して、user
というキーをそのまま使うと、anonymous
になってしまう。
0: jdbc:drill:zk=local> select * from mongo.test.actions t; +--------------------------------------+---------+-------------+------------------+ | _id | action | created_at | user | +--------------------------------------+---------+-------------+------------------+ | {"$oid":"5686bacac3220d960f34589c"} | add | 1451664185 | Walter Lynch | | {"$oid":"5686bad1c3220d960f34589d"} | add | 1451668314 | Irene Armstrong | | {"$oid":"5686badac3220d960f34589e"} | add | 1451671227 | Paul Bailey | | {"$oid":"5686bae1c3220d960f34589f"} | remove | 1451671349 | Walter Lynch | +--------------------------------------+---------+-------------+------------------+ 4 rows selected (0.315 seconds) 0: jdbc:drill:zk=local> select user from mongo.test.actions; +------------+ | user | +------------+ | anonymous | | anonymous | | anonymous | | anonymous | +------------+ 4 rows selected (0.171 seconds)
これはバッククォートだけでもダメで、collectionとセットで指定しないと正しく取得できない。
0: jdbc:drill:zk=local> select `user`, t.`user` from mongo.test.actions t; +------------+------------------+ | user | user0 | +------------+------------------+ | anonymous | Walter Lynch | | anonymous | Irene Armstrong | | anonymous | Paul Bailey | | anonymous | Walter Lynch | +------------+------------------+ 4 rows selected (0.133 seconds)
このanonymous
は接続ユーザ名というわけでもないようだし謎なのだけれど、サブクエリ内で集計して結果出力していたら、何故か結果が常に1行になってしまい、無駄に時間を費やしてしまった。
Apache Drill 1.2.0までは、(dfs経由での)JSONやMySQLに対してuser
というキーを使うとエラーになる問題もあったけれど、1.3.0以降で解消されていた。
0: jdbc:drill:zk=local> select user from dfs.`/tmp/actions.json`; Error: DATA_READ ERROR: Error parsing JSON - Cannot read from the middle of a record. Current token was START_ARRAY 0: jdbc:drill:zk=local> select * from mysql.mysql.`user`; Error: VALIDATION ERROR: java.lang.NullPointerException
そもそもキー名として微妙な感じもするけれど、外部データだと如何ともし難い場合があったりではあるので悩ましい。