2016-11-24 7 views
1

ローカルモードでSpark2.0.2を使用しています。私は2つのデータセットを結合する結合を持っています。Spark Dataset Error:この結合の両側がブロードキャストのしきい値外にあり、計算が非常に高価になる可能性があります。

spark sqlまたはdataframe API(型なしのデータセット[行])を使用すると非常に高速です。 しかし、型付きDataset APIを使用すると、以下のエラーが発生します。

スレッド "main"の例外org.apache.spark.sql.AnalysisException:この結合の両側がブロードキャスト・スレッショルドの外側にあり、計算が非常に高価になる可能性があります。明示的に有効にするには、spark.sql.crossJoin.enabled = trueを設定してください。

「spark.sql.conf.autoBroadcastJoinThreshold」が増加しますが、それでも同じエラーです。そして、私は "spark.sql.crossJoin.enabled"を "true"に設定しますが、それは動作しますが、完了には非常に時間がかかります。

私は再分割をしませんでした。ソースは2つの部分です。

答えて

3

自動ブロードキャストのしきい値は2GB(https://issues.apache.org/jira/browse/SPARK-6235)に制限されています。そのため、テーブルサイズがこの値を超えると、これを行うことはできません。 回避策は、次のようにブロードキャスト機能を使用してsparksqlためのヒントを提供することができます

largeTableDf.join(broadcast(smallTableDf), "key")) 
+0

こんにちは、私はお返事ありがとうございます。しかしそれはまだ同じです。私はds1.joinWith(ブロードキャスト(ds2)、ds1( "key1")=== ds2( "key2")、 "left_outer")を使用します。それはまだ非常に遅いです。また、型なしのAPIやSQLを使用すると非常に高速ですが、私はbroadcast()関数を使用する必要はありません。 –

0

私はその理由を発見しました。 私のds1には、ds2の結合キーと同じフィールド "key2"もあります。 ds2( "key2")の名前をds2( "key3")に変更した後、以下の結合が速くなりました。

ds1.joinWith(放送(DS2)、DS1( "キー1")=== DS2( "KEY3")、 "left_outer")

誰もがその理由を説明していただけますか?

+0

key2を使用すると生成されるレコードの数は、key1が両方のケースでレコード数のカウントを送信できるかどうかよりも多いと思います –

関連する問題