クエリーでの直接結合の自動最適化の制御

DSEでは、テーブル全体のスキャンを使用するSparkシャッフルを実行せずに、データベース内のデータを直接検索するように結合クエリを最適化できます。

DSEでは、テーブル全体のスキャンを使用するSparkシャッフルを実行せずに、データベース内のデータを直接検索するように結合クエリを最適化できます。

この最適化は、デフォルトでオンになっています。直接結合は、次の場合に使用されます。

(table size * directJoinSizeRatio) > size of keys

directJoinSizeRatioの値は0~1にする必要があります。デフォルトでは、この値は0.9です。directJoinSizeRatio設定は、データベース・テーブルへの参照を作成するとき、またはSparkセッションで設定できます。

spark.conf.set("directJoinSizeRatio", 0.2)

directJoinSettingオプションを設定すると、この最適化を永続的に有効または無効にすることができます。directJoinSettingの有効な設定は次のとおりです。

  • 最適化を永続的に有効にするon
  • 最適化を永続的に無効にするoff
  • directJoinSizeRatio設定の基準に従って、DSEが有効にするタイミングを決定できるようにするauto(デフォルト値)

directJoin関数を呼び出すことで、プログラムでdirectJoinSettingを有効または無効にすることができます。

import org.apache.spark.sql.cassandra.CassandraSourceRelation._
import org.apache.spark.sql.cassandra._
val table = spark.read.cassandraFormat("tab", "ks").load
spark
  .range(1L,100000L)
  .withColumn("id", concat(lit("Store "), 'id))
  .join(table.directJoin(AlwaysOff), 'id === 'store)

directJoin関数をAlwaysOnに設定して最適化を永続的に有効にしたり、AlwaysOffを使用して最適化を永続的に無効にしたり、Automaticに設定して、前述のdirectJoinSizeRatioの式に従って、DSEが最適化を使用するタイミングを決定したりすることができます。

ほとんどのユーザーは、directJoinSettingオプションを変更しないでください。ほとんどの場合、直接結合は、テーブル全体のスキャンよりも高速です。計算の結果が最適でない場合は、自動結合のしきい値を調整するか、最適化をオフにします。