HiveQLのコメントについて

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

小ネタです。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のアップデートはしなくなっている気もしますが、コメント行もインデントに対応してくれると嬉しいかなーと思ったりしました。。

参考