Petunjuk
Berlaku untuk: Databricks SQL Databricks Runtime
Sarankan pendekatan khusus untuk membuat rencana eksekusi.
Sintaks
/*+ { partition_hint | join_hint | skew_hint } [, ...] */
Petunjuk pemartisian
Petunjuk partisi memungkinkan Anda menyarankan strategi pemartisian yang harus diikuti Azure Databricks.
Petunjuk COALESCE
, REPARTITION
, dan REPARTITION_BY_RANGE
didukung dan setara dengan masing-masing API Himpunan data coalesce
, repartition
, dan repartitionByRange
.
Petunjuk ini memberi Anda cara untuk menyetel performa dan mengontrol jumlah file output.
Saat beberapa petunjuk pemartisian ditentukan, beberapa node dimasukkan ke dalam rencana logis, tetapi petunjuk paling kiri dipilih oleh pengoptimal.
Sintaks
partition_hint
COALESCE ( part_num ) |
REPARTITION ( { part_num | [ part_num , ] column_name [ , ...] } ) |
REPARTITION_BY_RANGE ( column_name [, ...] [, part_num] ) |
REBALANCE [ ( column_name [, ...] ) ]
Jenis petunjuk partisi
COALESCE ( part_num )
Kurangi jumlah partisi ke jumlah partisi yang ditentukan. Dibutuhkan nomor partisi sebagai parameter.
REPARTITION ( { part_num | [ part_num , ] column_name [ , ...] } )
Partisi ulang ke jumlah partisi yang ditentukan menggunakan ekspresi pemartisian yang ditentukan. Dibutuhkan nomor partisi, nama kolom, atau keduanya sebagai parameter.
REPARTITION_BY_RANGE ( column_name [, ...] [, part_num]
Partisi ulang ke jumlah partisi yang ditentukan menggunakan ekspresi pemartisian yang ditentukan. Dibutuhkan nama kolom dan nomor partisi opsional sebagai parameter.
REBALANCE [ ( column_name [, ...] ) ]
Petunjuk
REBALANCE
dapat digunakan untuk menyeimbangkan kembali partisi output hasil kueri, sehingga setiap partisi memiliki ukuran yang wajar (tidak terlalu kecil atau besar). Ini dapat mengambil nama kolom sebagai parameter, dan mencoba yang terbaik untuk mempartisi hasil kueri oleh kolom ini. Ini adalah upaya terbaik: jika ada kemiringan, Spark akan membagi partisi miring, untuk membuat partisi ini tidak terlalu besar. Petunjuk ini berguna saat Anda perlu menulis hasil kueri ini ke tabel, guna menghindari file yang terlalu kecil/besar. Petunjuk ini diabaikan jika AQE tidak diaktifkan.-
Nama kolom atau alias yang diekspos untuk partisi ulang atau penyeimbangan ulang.
part_num
Angka integral harfiah. Jumlah partisi yang akan dipartisi ulang.
Contoh
> SELECT /*+ COALESCE(3) */ * FROM t;
> SELECT /*+ REPARTITION(3) */ * FROM t;
> SELECT /*+ REPARTITION(c) */ * FROM t;
> SELECT /*+ REPARTITION(3, c) */ * FROM t;
> SELECT /*+ REPARTITION_BY_RANGE(c) */ * FROM t;
> SELECT /*+ REPARTITION_BY_RANGE(3, c) */ * FROM t;
> SELECT /*+ REBALANCE */ * FROM t;
> SELECT /*+ REBALANCE(c) */ * FROM t;
-- When a column name has been occluded by an alias you must refere to it by the alias name.
> SELECT /*+ REBALANCE(d) */ * FROM t AS s(d);
-- multiple partitioning hints
> EXPLAIN EXTENDED SELECT /*+ REPARTITION(100), COALESCE(500), REPARTITION_BY_RANGE(3, c) */ * FROM t;
== Parsed Logical Plan ==
'UnresolvedHint REPARTITION, [100]
+- 'UnresolvedHint COALESCE, [500]
+- 'UnresolvedHint REPARTITION_BY_RANGE, [3, 'c]
+- 'Project [*]
+- 'UnresolvedRelation [t]
== Analyzed Logical Plan ==
name: string, c: int
Repartition 100, true
+- Repartition 500, false
+- RepartitionByExpression [c#30 ASC NULLS FIRST], 3
+- Project [name#29, c#30]
+- SubqueryAlias spark_catalog.default.t
+- Relation[name#29,c#30] parquet
== Optimized Logical Plan ==
Repartition 100, true
+- Relation[name#29,c#30] parquet
== Physical Plan ==
Exchange RoundRobinPartitioning(100), false, [id=#121]
+- *(1) ColumnarToRow
+- FileScan parquet default.t[name#29,c#30] Batched: true, DataFilters: [], Format: Parquet,
Location: CatalogFileIndex[file:/spark/spark-warehouse/t], PartitionFilters: [],
PushedFilters: [], ReadSchema: struct<name:string>
Petunjuk gabungan
Petunjuk gabung memungkinkan Anda untuk menyarankan strategi bergabung yang harus digunakan Databricks SQL.
Ketika petunjuk strategi gabung yang berbeda ditentukan di kedua sisi gabung, Databricks SQL memprioritaskan petunjuk dalam urutan berikut: BROADCAST
dari MERGE
dari SHUFFLE_HASH
dari SHUFFLE_REPLICATE_NL
.
Ketika kedua sisi ditentukan dengan petunjuk BROADCAST
atau petunjuk SHUFFLE_HASH
, Databricks SQL memilih sisi build berdasarkan jenis gabungan dan ukuran hubungan.
Karena strategi tertentu mungkin tidak mendukung semua jenis gabungan, Databricks SQL tidak dijamin untuk menggunakan strategi gabungan yang disarankan oleh petunjuk.
Sintaks
join_hint
BROADCAST ( table_name ) |
MERGE ( table_name ) |
SHUFFLE_HASH ( table_name ) |
SHUFFLE_REPLICATE_NL ( table_name )
BROADCASTJOIN
dan MAPJOIN
didukung sebagai alias untuk BROADCAST
.
SHUFFLE_MERGE
dan MERGEJOIN
didukung sebagai alias untuk MERGE
.
Tipe petunjuk gabung
BROADCAST ( table_name )
Gunakan gabungan siaran. Sisi bergabung dengan petunjuk disiarkan terlepas dari
autoBroadcastJoinThreshold
. Jika kedua sisi bergabung memiliki petunjuk siaran, sisi dengan ukuran lebih kecil (berdasarkan statistik) disiarkan.MERGE ( table_name )
Gunakan join gabungan pengurutan acak.
SHUFFLE_HASH ( table_name )
Gunakan join hash acak. Jika kedua belah pihak memiliki petunjuk hash acak, Databricks SQL memilih sisi yang lebih kecil (berdasarkan statistik) sebagai sisi build.
SHUFFLE_REPLICATE_NL ( table_name )
Gunakan gabungan perulangan bertumpuk acak-dan-replika.
-
Nama tabel atau alias tabel yang diekspos yang diterapkan petunjuk.
Contoh
-- Join Hints for broadcast join
> SELECT /*+ BROADCAST(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
> SELECT /*+ BROADCASTJOIN (t1) */ * FROM t1 left JOIN t2 ON t1.key = t2.key;
> SELECT /*+ MAPJOIN(t2) */ * FROM t1 right JOIN t2 ON t1.key = t2.key;
-- Join Hints for shuffle sort merge join
> SELECT /*+ SHUFFLE_MERGE(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
> SELECT /*+ MERGEJOIN(t2) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
> SELECT /*+ MERGE(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
-- Join Hints for shuffle hash join
> SELECT /*+ SHUFFLE_HASH(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
-- Join Hints for shuffle-and-replicate nested loop join
> SELECT /*+ SHUFFLE_REPLICATE_NL(t1) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
-- When different join strategy hints are specified on both sides of a join, Databricks SQL
-- prioritizes the BROADCAST hint over the MERGE hint over the SHUFFLE_HASH hint
-- over the SHUFFLE_REPLICATE_NL hint.
-- Databricks SQL will issue Warning in the following example
-- org.apache.spark.sql.catalyst.analysis.HintErrorLogger: Hint (strategy=merge)
-- is overridden by another hint and will not take effect.
> SELECT /*+ BROADCAST(t1), MERGE(t1, t2) */ * FROM t1 INNER JOIN t2 ON t1.key = t2.key;
-- When a table name is occluded by an alias you must use the alias name in the hint
> SELECT /*+ BROADCAST(t1), MERGE(s1, s2) */ * FROM t1 AS s1 INNER JOIN t2 AS s2 ON s1.key = s2.key;
Petunjuk skew
(Delta Lake) Lihat Pengoptimalan gabungan condong menggunakan petunjuk condong untuk informasi tentang petunjuk.SKEW