HiveQLのコメントについて
小ネタです。Hiveのクエリ言語であるHiveQLのコメントの書き方についてです。HiveのCLIは昔から存在するHive CLIとHiveServer2のクライアントであるBeelineの2種類があります。EMRでStepとしてHiveクエリを実行する際はHive CLIが利用されるため、当初はHive CLIのみ調べていたのですが、ついでにBeelineについても調べてみました。
前提
EMRリリース5系と4系の両方について確認するため、対応するHive 2.1.0 とHive 1.0.0 のソースについて確認しています。 About Amazon EMR Releases - Amazon EMR
後述のGitHubのリンクは 1.0.0 となっていますが、2.1.0 でも同じ内容であることを確認しています。
Hive CLIのコメント
Hive CLIで利用できるのは以下の1種類のコメントのみです。
- 行頭が
//
で始まる場合
以下が該当するコードです。if (! line.startsWith("--"))
でコメント行を読み捨てていることが分かります。
public int processReader(BufferedReader r) throws IOException { String line; StringBuilder qsb = new StringBuilder(); while ((line = r.readLine()) != null) { // Skipping through comments if (! line.startsWith("--")) { qsb.append(line + "\n"); } } return (processLine(qsb.toString())); }
hive/CliDriver.java at release-1.0.0 · apache/hive
Beelineのコメント
Beelineの場合は以下の2種類のコメントに対応しています。
- 先頭が
//
で始まる場合 - 先頭が
#
で始まる場合
以下が該当するコードです。Hive CLIとくらべて最初にtrim()
しているためインデントにも対応しています。
boolean isComment(String line) { // SQL92 comment prefix is "--" // beeline also supports shell-style "#" prefix String lineTrimmed = line.trim(); return lineTrimmed.startsWith("#") || lineTrimmed.startsWith("--"); }
hive/BeeLine.java at release-1.0.0 · apache/hive
最後に
EMRでHiveを実行する際にある程度複雑なクエリになったのでコメントの書き方について調査した際のメモでした。ブログ化するのでついでにBeelineについても調べたのですが、Beelineの方が気が利いてましたね。さすがにHive Cliのアップデートはしなくなっている気もしますが、コメント行もインデントに対応してくれると嬉しいかなーと思ったりしました。。