Aracılığıyla paylaş


İpuçları

Şunlar için geçerlidir:onay işareti evet olarak işaretlenmiş Databricks SQL onay işareti evet olarak işaretlenmiş Databricks Runtime

Yürütme planı oluşturmak için belirli yaklaşımlar önerin.

Sözdizimi

/*+ { partition_hint | join_hint | skew_hint } [, ...] */

Bölümleme ipuçları

Bölümleme ipuçları, Azure Databricks'in izlemesi gereken bir bölümleme stratejisi önermenizi sağlar. COALESCE, REPARTITIONve REPARTITION_BY_RANGE ipuçları desteklenir ve sırasıyla , coalesceve repartition Veri Kümesi API'lerine repartitionByRangeeşdeğerdir. Bu ipuçları size performansı ayarlamanın ve çıkış dosyalarının sayısını denetlemenin bir yolunu sağlar. Birden çok bölümleme ipucu belirtildiğinde, mantıksal plana birden çok düğüm eklenir, ancak en soldaki ipucu iyileştirici tarafından seçilir.

Sözdizimi

partition_hint
  COALESCE ( part_num ) |
  REPARTITION ( { part_num | [ part_num , ] column_name [ , ...] } ) |
  REPARTITION_BY_RANGE ( part_num [, column_name [, ...] ] | column_name [, ...] ) |
  REBALANCE [ ( column_name [, ...] ) ]

Bölümleme ipucu türleri

  • COALESCE ( part_num )

    Bölüm sayısını belirtilen bölüm sayısına düşürün. Parametre olarak bir bölüm numarası alır.

  • REPARTITION ( { part_num | [ part_num , ] column_name [ , ...] } )

    Belirtilen bölümleme ifadelerini kullanarak belirtilen bölüm sayısına yeniden bölümleme. Bir bölüm numarası, sütun adları veya her ikisini de parametre olarak alır.

  • REPARTITION_BY_RANGE ( part_num [, column_name [, ...] ] | column_name [, ...] )

    Belirtilen bölümleme ifadelerini kullanarak belirtilen bölüm sayısına yeniden bölümleme. Sütun adlarını ve isteğe bağlı bir bölüm numarasını parametre olarak alır.

  • REBALANCE [ ( column_name [, ...] ) ]

    REBALANCE ipucu, sorgu sonucu çıkış bölümlerini yeniden dengelemek için kullanılabilir, böylece her bölüm makul boyuttadır (çok küçük değil ve çok büyük değildir). Sütun adlarını parametre olarak alabilir ve sorgu sonucunu bu sütunlara göre bölümlendirmek için en iyi şekilde deneyebilir. Bu en iyi çabadır: Dengesizlik varsa Spark, bu bölümlerin çok büyük olmaması için çarpık bölümleri böler. Bu ipucu, çok küçük/büyük dosyalardan kaçınmak için bu sorgunun sonucunu bir tabloya yazmanız gerektiğinde kullanışlıdır. AQE etkin değilse bu ipucu yoksayılır.

  • column_name

    Yeniden bölümlendirmek veya yeniden dengelemek için bir sütunun veya takma adın görünen adı.

  • part_num

    Tam sayı değişmez değeri. Yeniden bölümlendirecek bölüm sayısı.

Örnekler

> 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>

Katılım ipuçları

Birleştirme ipuçları, Databricks SQL'in kullanması gereken birleştirme stratejisini önermenizi sağlar. Birleştirmenin her iki tarafında farklı birleştirme stratejisi ipuçları belirtildiğinde, Databricks SQL ipuçlarını şu sırayla önceliklendirir: BROADCAST öncesinde MERGE öncesinde SHUFFLE_HASH öncesinde SHUFFLE_REPLICATE_NL. her iki taraf da BROADCAST ipucu veya SHUFFLE_HASH ipucuyla belirtildiğinde Databricks SQL, birleştirme türüne ve ilişkilerin boyutlarına göre derleme tarafını seçer. Belirli bir strateji tüm birleştirme türlerini desteklemeyebileceği için Databricks SQL'in ipucu tarafından önerilen birleştirme stratejisini kullanması garanti değildir.

Sözdizimi

join_hint
  BROADCAST ( table_name ) |
  MERGE ( table_name ) |
  SHUFFLE_HASH ( table_name ) |
  SHUFFLE_REPLICATE_NL ( table_name )

BROADCASTJOIN ve MAPJOIN için diğer ad olarak BROADCASTdesteklenir.

SHUFFLE_MERGE ve MERGEJOIN için diğer ad olarak MERGEdesteklenir.

İpucu türlerini birleştirme

  • BROADCAST ( table_name )

    Yayın katılımını kullanın. İpucu bulunan birleştirme tarafı, autoBroadcastJoinThreshold'nin durumu gözetilmeksizin yayınlanır. Birleştirmenin her iki tarafı da yayın ipuçlarına sahipse, boyutu daha küçük olan (istatistiklere göre) yayınlanır.

  • MERGE ( table_name )

    Karıştır-sıralama-birleştirme-bağlamayı kullanın.

  • SHUFFLE_HASH ( table_name )

    Karışık hash birleştirmeyi kullanın. Her iki tarafta da karışık karma ipuçları varsa Databricks SQL, derleme tarafı olarak daha küçük olan tarafı (istatistiklere göre) seçer.

  • SHUFFLE_REPLICATE_NL ( table_name )

    Karıştırma ve çoğaltma iç içe döngü birleştirmesini kullanın.

  • table_name

    İpucunun uygulandığı tablonun veya tablo diğer adının kullanıma sunulan adı.

Örnekler

-- 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;

Eğme ipuçları

(Delta Lake) ipucu hakkında bilgi için bkz. SKEW.