基本的な構文ミスなどのエラーについてHiveQLステートメントを検証するプログラム的な方法はありますか?デバッグ時間を節約するために、ステートメントをElasticMapReduceに送信する前にチェックしたいと思います。
3 に答える
はいあります!
実際にはかなり簡単です。
手順:
1. あなたの言語で Hive thrift クライアントを取得します。
私はルビーなので、このラッパーを使用します - https://github.com/forward/rbhive (gem install rbhive)
Ruby を使用していない場合は、Hive ソースをダウンロードし、含まれている thrift 構成ファイルで thrift を実行して、ほとんどの言語でクライアント コードを生成できます。
2. ポート 10001 でハイブに接続し、describe クエリを実行します。
ルビーでは、これは次のようになります。
RBHive.connect(host, port) do |connection|
connection.fetch("describe select * from categories limit 10")
end
クエリが無効な場合、クライアントは例外をスローし、構文が無効な理由の詳細を示します。構文が有効な場合、Describe はクエリ ツリーを返します (この場合は無視できます)。
それが役立つことを願っています。
「カテゴリ制限10からselect*を説明する」はうまくいきませんでした。
たぶん、これは使用しているHiveバージョンに関連しています。私はHive0.8.1.4を使用しています
いくつかの調査を行った後、私はMatthewRathboneが提供したものと同様の解決策を見つけました。
Hiveは、クエリの実行プランを表示するEXPLAINコマンドを提供します。このステートメントの構文は次のとおりです。
EXPLAIN[EXTENDED]クエリ
したがって、rbhiveも使用しているすべての人にとって:
RBHive.connect(host, port) do |c|
c.execute("explain select * from categories limit 10")
end
Explainは成功した場合に結果を返さないため、c.fetchをc.executeに置き換える必要があることに注意してください=> rbhiveは、構文が正しいかどうかに関係なく例外をスローします。
構文エラーが発生した場合、またはクエリしているテーブル/列が存在しない場合、executeは例外をスローします。すべてが正常であれば、例外はスローされませんが、結果は表示されません。これは悪いことではありません。
最新バージョンの hive 2.0 には hplsql ツールが付属しており、実際に実行しなくても hive コマンドを検証できます。
構成: 以下の XML を hive/conf フォルダーに追加し、ハイブを再起動します。
https://github.com/apache/hive/blob/master/hplsql/src/main/resources/hplsql-site.xml
hplsql を実行してクエリを検証するには、次のコマンドを使用してください。
hplsql -offline -trace -e 'select * from sample'
(または) ファイル全体を検証するには
hplsql -offline -trace -f samplehql.sql
クエリ構文が正しい場合、hplsql からの応答は次のようになります。
Ln:1 SELECT // type
Ln:1 select * from sample // command
Ln:1 Not executed - offline mode set // execution status
クエリの構文が間違っている場合、クエリの構文の問題が報告されます
Hive のバージョンが古い場合は、hplsql jar を hive/lib 内に手動で配置して続行する必要があります。