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