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経由での)JSONMySQLに対して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

そもそもキー名として微妙な感じもするけれど、外部データだと如何ともし難い場合があったりではあるので悩ましい。