クエリーでの直接結合の自動最適化の制御
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オプションを変更しないでください。ほとんどの場合、直接結合は、テーブル全体のスキャンよりも高速です。計算の結果が最適でない場合は、自動結合のしきい値を調整するか、最適化をオフにします。
