インパラのクエリー結果がコンソールに結果を出力せずに完全にマテリアライズされるようにするための信頼できる効率的な方法はありますか? 例として、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;
は、しかし、まだ、私は明らかにされていませんマテリアライズされたサブクエリを、確認する必要があります。たぶん、そのトリックや他のトリックを強制するヒントがありますか?
問合せをマテリアライズする必要がありますが、問合せをマテリアライズ(ディスクに保存されたデータ)する必要はありません。そこにはある種の矛盾があります。あるいは、インパラのデーモンをストレステストしたいだけで、OOMをどの時点で諦めているのかを知ることができますか? –
つまり、Impalaは分散キャッシュ(*àla * Redis)ではなく、データ処理フレームワーク(*àla * Spark)ではなくSQL実行エンジンです。クエリが実行されても、何も残っていません。いくつかのログを除いて。 –
@SamsonScharfrichterコメントをいただきありがとうございます。多くのSQLデータベースでは、クエリ結果を随時変数に保存し、さらにそれを再利用することができます。インパラがそのような特徴を持っているなら、私の場合を解決するだろう。私はクエリを実現したいと思いますが、結果の送信/印刷のオーバーヘッドを望んでいないので、 'select count(*)'外部クエリはselect *としてテーブルを作成するよりもはるかに優れています。私は矛盾があるとは思わない。サーバー側でのクエリ実行の正確なタイミング。 – jangorecki