2016-07-15 1 views
3

インパラのクエリー結果がコンソールに結果を出力せずに完全にマテリアライズされるようにするための信頼できる効率的な方法はありますか? 例として、INNER JOINクエリを使用します。Impalaのクエリーがマテリアライズされるようにする

クエリ結果を具体化するための明らかな方法は、というテーブルを選択として作成することです。

CREATE TABLE t3 STORED AS PARQUET AS SELECT t1.* FROM t1 INNER JOIN t2 ON t1.id=t2.id; 

それに伴う問題は、それが非効率的であるため、ディスクへの書き込みを行うということです。私はクエリを実行し、結果が具体化されていることを確認する最も効率的な方法を探しています。

例として、Sparkでは.cacheメソッドを使用し、次に.countを使用してクエリが実現されるようにすることができます。

val t3 = t1.join(t2, "id") 
t3.cache 
t3.count 

私は、サブクエリでの回避策を試みることができます。クエリオプティマイザは、私は総数で唯一興味があることを発見した場合

SELECT COUNT(*) FROM (SELECT t1.* FROM t1 INNER JOIN t2 ON t1.id=t2.id) t3; 

は、しかし、まだ、私は明らかにされていませんマテリアライズされたサブクエリを、確認する必要があります。たぶん、そのトリックや他のトリックを強制するヒントがありますか?

+0

問合せをマテリアライズする必要がありますが、問合せをマテリアライズ(ディスクに保存されたデータ)する必要はありません。そこにはある種の矛盾があります。あるいは、インパラのデーモンをストレステストしたいだけで、OOMをどの時点で諦めているのかを知ることができますか? –

+0

つまり、Impalaは分散キャッシュ(*àla * Redis)ではなく、データ処理フレームワーク(*àla * Spark)ではなくSQL実行エンジンです。クエリが実行されても、何も残っていません。いくつかのログを除いて。 –

+0

@SamsonScharfrichterコメントをいただきありがとうございます。多くのSQLデータベースでは、クエリ結果を随時変数に保存し、さらにそれを再利用することができます。インパラがそのような特徴を持っているなら、私の場合を解決するだろう。私はクエリを実現したいと思いますが、結果の送信/印刷のオーバーヘッドを望んでいないので、 'select count(*)'外部クエリはselect *としてテーブルを作成するよりもはるかに優れています。私は矛盾があるとは思わない。サーバー側でのクエリ実行の正確なタイミング。 – jangorecki

答えて

1

AFAIKあなたはのインパラでそれを行うことはできませんし、決してできません。
Clouderaは、特にTableau、Qlik、MicroStrategyなどのBIツールをサポートするツールを設計しましたが、ad hoc ETLスクリプトはサポートしていません。

一方、ハイブには、ニーズに合った「HPL-SQL」プロシージャ言語ラッパーが同梱されています。警告:

  • ハイブ2.0+が必要です内HPL-SQLインタプリタではなく、ベースハイブクライアント(も標準JDBC接続)

そして、それをあなたの全体のスクリプトを実行している必要がありHPL-SQLツールは、がImpalaクエリをサポートしていると主張していますが、私はその請求を調査しませんでした。不器用な回避策として、あなたの問題を解決できました。

参考文献:回避策の
    HIVE-11055(PL/HQLツールは、ハイブのコードベースに貢献)
    HPL/SQL website


いえば、あなた自身を示唆したように、なぜ、スパークを使用しません? SparkネイティブParquetライブラリを使用するか、ImpalaデーモンへのカスタムJDBC接続を使用して、Impala/Hiveテーブルを読むことができます。本質的にHPL/SQLソリューションに似ています。

+0

ありがとうございます。ベンチマークではImpalaをより正確に反映させたいと思っていました。最良の方法は、 'select count(*)'と 'create table as select'という2つの異なるクエリをテストして、 – jangorecki

関連する問題