معالجة الأخطاء في Azure Databricks
ينطبق على: Databricks SQL
Databricks Runtime 12.2 وما فوق
مكونات الخطأ
عندما يثير Azure Databricks خطأ فإنه يتضمن المكونات التالية:
-
سلسلة وصفية قابلة للقراءة من قبل الإنسان فريدة من نوعها لحالة الخطأ.
تتضمن بعض فئات الخطأ تسميات فرعية.
على سبيل المثال: TABLE_OR_VIEW_NOT_FOUND، INCOMPLETE_TYPE_DEFINITION . صفيف.
للحصول على قائمة بجميع فئات الخطأ، راجع فئات الخطأ.
-
سلسلة طويلة مكونة من خمسة أحرف، تجمع فئات الخطأ في تنسيق قياسي معتمد من قبل العديد من المنتجات وواجهات برمجة التطبيقات.
على سبيل المثال:
'42P01'
للحصول على قائمة كاملة بجميع
SQLSTATE
s المستخدمة من قبل Azure Databricks، راجع SQLSTATEs. رسالة ذات معلمات
رسالة الخطأ مع العناصر النائبة للمعلمات.
على سبيل المثال: يتضمن TABLE_OR_VIEW_NOT_FOUND الرسالة التالية:
The table or view <relationName> cannot be found.
يمكنك استخدام الرسالة ذات المعلمات لعرض رسالة خطأ عن طريق تعيين قيم معلمات الرسالة إلى علامات المعلمة
<parameter>
.معلمات الرسالة
خريطة للمعلمات والقيم التي توفر معلومات إضافية حول الخطأ. على سبيل المثال:
'relationName' -> 'main.default.tab1'
.رسالة
رسالة الخطأ المعروضة بالكامل، بما في ذلك فئة الخطأ و
SQLSTATE
، مع ملء المعلمات. على سبيل المثال:[TABLE_OR_VIEW_NOT_FOUND] The table or view `does_not_exist` cannot be found. Verify the spelling and correctness of the schema and catalog. If you did not qualify the name with a schema, verify the current_schema() output, or qualify the name with the correct schema and catalog. To tolerate the error on drop use DROP VIEW IF EXISTS or DROP TABLE IF EXISTS. SQLSTATE: 42P01; line 1 pos 14; 'Project [*] +- 'UnresolvedRelation [does_not_exist], [], false
تحذير
الرسالة والرسالة ذات المعلمات غير مستقرتين عبر الإصدارات.
قد يتم تغيير نص الرسالة أو ترجمته دون إشعار.
لمعالجة شرط خطأ برمجيا، استخدم "فئة الخطأ" و"SQLSTATE
معلمات الرسالة" بدلا من ذلك.
معالجة حالات الخطأ
ينطبق على: Databricks SQL
Databricks Runtime 14.2 وما فوق
يوفر Azure Databricks واجهات برمجة تطبيقات محددة للغة لمعالجة حالات الخطأ.
Python
بالنسبة إلى Python، استخدم pySparkException
PySparkException.getErrorClass()
: إرجاع فئة الخطأ للاستثناء كسلسلة.PySparkException.getMessageParameters()
: إرجاع معلمات الرسالة للاستثناء كقاموس.PySparkException.getSqlState()
: إرجاعSQLSTATE
التعبير كسلسلة.
Scala
بالنسبة إلى Scala، استخدم SparkThrowable
getErrorClass()
: إرجاع فئة خطأ كسلسلة.getMessageParameters()
: إرجاع معلمات رسالة كخريطة.getSqlState()
: إرجاع SQLSTATE كسلسلة.
الأمثلة
التقاط أي استثناء وعرض فئة الخطأ ومعلمات الرسالة و
SQLSTATE
. عرض رسالة الخطأ الافتراضية أيضاScala
import org.apache.spark.SparkThrowable try { spark.sql("SELECT * FROM does_not_exist").show() } catch { case ex: SparkThrowable => println("Error Class : " + ex.getErrorClass) println("Message parameters: " + ex.getMessageParameters()) println("SQLSTATE : " + ex.getSqlState) println(ex) }
Python
from pyspark.errors import PySparkException try: spark.sql("SELECT * FROM does_not_exist").show() except PySparkException as ex: print("Error Class : " + ex.getErrorClass()) print("Message parameters: " + str(ex.getMessageParameters())) print("SQLSTATE : " + ex.getSqlState()) print(ex)
نتيجة
Error Class : TABLE_OR_VIEW_NOT_FOUND Message parameters: {'relationName': '`does_not_exist`'} SQLSTATE : 42P01 [TABLE_OR_VIEW_NOT_FOUND] The table or view `does_not_exist` cannot be found. Verify the spelling and correctness of the schema and catalog. If you did not qualify the name with a schema, verify the current_schema() output, or qualify the name with the correct schema and catalog. To tolerate the error on drop use DROP VIEW IF EXISTS or DROP TABLE IF EXISTS. SQLSTATE: 42P01; line 1 pos 14; 'Project [*] +- 'UnresolvedRelation [does_not_exist], [], false
التقاط SQLSTATE
42P01
فقط وعرض رسالة مخصصة:Scala
import org.apache.spark.SparkThrowable try { spark.sql("SELECT * FROM does_not_exist").show() } catch { case ex: SparkThrowable if (ex.getSqlState == "42P01") => println("I'm so sorry, but I cannot find: " + ex.getMessageParameters().get("relationName")) }
Python
from pyspark.errors import PySparkException try: spark.sql("SELECT * FROM does_not_exist").show() except PySparkException as ex: if (ex.getSqlState() == "42P01"): print("I'm so sorry, but I cannot find: " + ex.getMessageParameters()['relationName']) else: raise
نتيجة
I'm so sorry, but I cannot find: `does_not_exist`
التقاط فئة
TABLE_OR_VIEW_NOT_FOUND
الخطأ فقط وعرض رسالة مخصصة:Scala
import org.apache.spark.SparkThrowable try { spark.sql("SELECT * FROM does_not_exist").show() } catch { case ex: SparkThrowable if (ex.getErrorClass == "TABLE_OR_VIEW_NOT_FOUND") => println("I'm so sorry, but I cannot find: " + ex.getMessageParameters().get("relationName")) }
Python
from pyspark.errors import PySparkException try: spark.sql("SELECT * FROM does_not_exist").show() except PySparkException as ex: if (ex.getErrorClass() == "TABLE_OR_VIEW_NOT_FOUND"): print("I'm so sorry, but I cannot find: " + ex.getMessageParameters()['relationName']) else: raise
نتيجة
I'm so sorry, but I cannot find: `does_not_exist`
استثناءات رفعها المستخدم
يوفر Azure Databricks الوظائف التالية لرفع الأخطاء المعرفة من قبل المستخدم:
-
رفع استثناء مع رسالة خطأ مخصصة.
-
رفع خطأ مع رسالة خطأ اختيارية، إذا لم يتم استيفاء شرط.
ترجع كلتا الدالتين فئة الخطأ "USER_RAISED_EXCEPTION" والجانب SQLSTATE
'P0001'
مع رسالة معرفة من قبل المستخدم.
الأمثلة
> SELECT raise_error('This is a custom error message');
[USER_RAISED_EXCEPTION] This is a custom error message. SQLSTATE: P0001
> SELECT assert_true(1 = 2, 'One is not two!');
[USER_RAISED_EXCEPTION] One is not two! SQLSTATE: P0001
> SELECT assert_true(1 = 2);
[USER_RAISED_EXCEPTION] '(1 = 2)' is not true! SQLSTATE: P0001