تلميحات
ينطبق على: Databricks SQL Databricks Runtime
اقتراح نهج محددة لإنشاء خطة تنفيذ.
بناء الجملة
/*+ { partition_hint | join_hint | skew_hint } [, ...] */
تلميحات التقسيم
تسمح لك تلميحات التقسيم باقتراح استراتيجية تقسيم يجب أن تتبعها Azure Databricks.
COALESCE
REPARTITION
يتم دعم و و REPARTITION_BY_RANGE
و تلميحات وهي مكافئة لواجهات repartition
coalesce
برمجة تطبيقات مجموعة البيانات و و repartitionByRange
على التوالي.
تمنحك هذه التلميحات طريقة لضبط الأداء والتحكم في عدد ملفات الإخراج.
عند تحديد تلميحات تقسيم متعددة، يتم إدراج عقد متعددة في الخطة المنطقية، ولكن يتم اختيار التلميح الموجود في أقصى اليسار بواسطة المحسن.
بناء الجملة
partition_hint
COALESCE ( part_num ) |
REPARTITION ( { part_num | [ part_num , ] column_name [ , ...] } ) |
REPARTITION_BY_RANGE ( column_name [, ...] [, part_num] ) |
REBALANCE [ ( column_name [, ...] ) ]
تقسيم أنواع التلميحات
COALESCE ( part_num )
تقليل عدد الأقسام إلى العدد المحدد من الأقسام. يأخذ رقم قسم كمعلمة.
REPARTITION ( { part_num | [ part_num , ] column_name [ , ...] } )
إعادة تقسيم إلى العدد المحدد من الأقسام باستخدام تعبيرات التقسيم المحددة. يأخذ رقم القسم أو أسماء الأعمدة أو كليهما كمعلمات.
REPARTITION_BY_RANGE ( column_name [, ...] [, part_num]
إعادة تقسيم إلى العدد المحدد من الأقسام باستخدام تعبيرات التقسيم المحددة. يأخذ أسماء الأعمدة ورقم القسم الاختياري كمعلمات.
REBALANCE [ ( column_name [, ...] ) ]
REBALANCE
يمكن استخدام التلميح لإعادة توازن أقسام إخراج نتيجة الاستعلام، بحيث يكون كل قسم بحجم معقول (ليس صغيرا جدا وليس كبيرا جدا). يمكن أن تأخذ أسماء الأعمدة كمعلمات، وتبذل قصارى جهدها لتقسيم نتيجة الاستعلام حسب هذه الأعمدة. هذا هو أفضل جهد: إذا كان هناك انحرافات، سيقوم Spark بتقسيم الأقسام المنحرفة، لجعل هذه الأقسام ليست كبيرة جدا. هذا التلميح مفيد عندما تحتاج إلى كتابة نتيجة هذا الاستعلام إلى جدول، لتجنب الملفات الصغيرة/الكبيرة جدا. يتم تجاهل هذا التلميح إذا لم يتم تمكين AQE.-
الاسم المكشوف لعمود أو اسم مستعار لإعادة تقسيمه أو إعادة توازنه بواسطة.
part_num
قيمة حرفية لرقم لا يتجزأ. عدد الأقسام التي يجب إعادة تقسيمها إليها.
الأمثلة
> 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>
الانضمام إلى التلميحات
تسمح لك تلميحات الانضمام باقتراح استراتيجية الانضمام التي يجب أن تستخدمها Databricks SQL.
عند تحديد تلميحات استراتيجية صلة مختلفة على جانبي الصلة، يعطي Databricks SQL الأولوية للتلميحات بالترتيب التالي: BROADCAST
عبر MERGE
SHUFFLE_HASH
.SHUFFLE_REPLICATE_NL
عند تحديد كلا الجانبين بالتلميح BROADCAST
أو SHUFFLE_HASH
التلميح، يختار Databricks SQL جانب البناء استنادا إلى نوع الصلة وأحجام العلاقات.
نظرا لأن استراتيجية معينة قد لا تدعم جميع أنواع الصلة، فإن Databricks SQL غير مضمون لاستخدام استراتيجية الانضمام المقترحة من قبل التلميح.
بناء الجملة
join_hint
BROADCAST ( table_name ) |
MERGE ( table_name ) |
SHUFFLE_HASH ( table_name ) |
SHUFFLE_REPLICATE_NL ( table_name )
BROADCASTJOIN
ويتم اعتماد و MAPJOIN
كتسميات مستعارة ل BROADCAST
.
SHUFFLE_MERGE
ويتم اعتماد و MERGEJOIN
كتسميات مستعارة ل MERGE
.
الانضمام إلى أنواع التلميح
BROADCAST ( table_name )
استخدم ربط البث. يتم بث جانب الصلة مع التلميح بغض النظر عن
autoBroadcastJoinThreshold
. إذا كان كلا جانبي الصلة يحتويان على تلميحات البث، يتم بث الجانب ذي الحجم الأصغر (استنادا إلى الإحصائيات).MERGE ( table_name )
استخدم ربط دمج الفرز العشوائي.
SHUFFLE_HASH ( table_name )
استخدم ربط تجزئة التبديل العشوائي. إذا كان لدى كلا الجانبين تلميحات تجزئة التبديل، فإن Databricks SQL يختار الجانب الأصغر (استنادا إلى الإحصائيات) كجانب البناء.
SHUFFLE_REPLICATE_NL ( table_name )
استخدم ربط التكرار الحلقي المتداخل العشوائي والنسخ المتماثل.
-
الاسم المكشوف لجدول أو اسم مستعار للجدول الذي ينطبق عليه التلميح.
الأمثلة
-- 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;
تلميحات انحراف
(Delta Lake) راجع تحسين الانضمام إلى انحراف باستخدام تلميحات الانحراف للحصول على SKEW
معلومات حول التلميح.