2016-10-07 11 views
2

Spark SQLで直接クエリを実行する方法を理解しようとしています。私の意味は:JavaでApache Spark SQLを使って直接SQLクエリを実行

SQLContext sql = new SQLContext(ctx); 
sql.sql("QUERY HERE"); 

どのようにデータベースの接続情報を設定するのですか?私はOracle DBを使用しています。私はsql.read().jdbc..方法を使用する前に。そしてそこに私はパラメータとして接続URLを渡します。しかし、SQLコンソールの直接クエリ(0.05秒)に比べて、この方法は実際には遅い(4秒)。

Greetz

答えて

3

おそらくあなたはSpark SQLの概念がありません。

リアルタイムプロキシデータベースにはエンジンではありません。高速キャッシュの場合は、Oracle Coherence、Hazelcast、Apache Ignite(ランダムな順序)などのデータグリッドを使用することができます。Sparkは大規模なデータセットで高速計算を行います。 03.10 Databricksのブログでは、articleとCERNのSparkの使用例があります。データベースで12時間実行される大きなクエリはSparkでわずか2分しかかかりません!

なぜ、クエリが遅いのですか?スパークSQLは、OLTPではなくOLAPシステムに似ています。高度なデータセットを非常に高速に処理できます。しかし、このデータはデータベースから読み取られ、Sparkで計算されなければなりません。だからこそ、あなたのケースでは時間がずっと大きくなっています。それは読み込み時間+計算時間です。データベースエンジンは、1つのステップで読み込みと計算を行うことができます(近似では実装は異なる場合があります)。

データが増えると、ロード時間は実行時間の割合が小さくなり、処理時間が大幅に長くなります。その後、スパークが最善を尽くします。これは、データベースエンジンの処理がSparkの処理よりもはるかに遅いためです.Sparkはクエリをより並列化できます。

どのようにクエリを調整できますか?それを一度読んだ後、メモリにキャッシュしてからクエリで使用します。小さなデータセットでは、まだ遅くなる可能性がありますが、大規模なデータセットで、このDataFrameを大量に使用すると助けになります

+0

これでデータが2倍または3倍以上になったら、 最後の部分です。だから、アプリケーションの開始時に 'DataFrame dfCached = sql.read().jdbc(URL、" TABLE "、props).cache();のようなすべてのデータフレームをキャッシュし、 – R3Tech

+0

さらに多くのデータが到着する場合、Sparkはそれらをデータベースから読み取る必要があります。だから、2倍のデータ= 2倍のデータロード時間。ただし、実行時間については覚えておいてください。多くの時間を節約できます。 2番目の質問について - はい、正確です。最初のクエリは遅くなります(Sparkはデータを読み込みます)が、次ははるかに高速になります。 'registerTempView'を実行すると、SQLクエリ –

+0

の' 2倍以上のデータ= 2倍のデータ読み込み時間 'でdfCachedを使用できます。したがって、Sparkは2倍遅くなりますか? Atm Imはすべて1つのスレーブでテストしています。だから、より多くの奴隷とスパークははるかに速くする必要がありますか?そして2回目にもう一度:しかし、頻繁に変更されるデータについてはどうでしょうか、それほど良いキャッシュではありません。 – R3Tech

関連する問題