Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к:
Databricks SQL
Databricks Runtime 12.2 и более поздних версий
Компоненты ошибок
Когда Azure Databricks вызывает ошибку, она включает следующие компоненты:
-
Описательная, читаемая человеком строка, уникальная для условия ошибки.
Некоторые условия ошибки включают подкондиции.
Например, TABLE_OR_VIEW_NOT_FOUND и INCOMPLETE_TYPE_DEFINITION.МАССИВ.
Список всех условий ошибки см. в разделе "Условия ошибки".
-
Пятизначная длинная строка, группирование условий ошибки в стандартный формат, поддерживаемый многими продуктами и API.
Например:
'42P01'Полный список всех
SQLSTATE, которые использует 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 предоставляет интерфейсы API, специфичные для языка, для обработки ошибок.
SQL
Область применения:
для Databricks SQL
для Databricks Runtime 16.3 и более поздних версий
Для SQL используется синтаксис составной инструкции для определения обработчиков условий.
-
DECLARE EXIT HANDLER: определяет обработчик для набора указанных условий ошибки,
SQLSTATEили любогоSQLEXCEPTION. -
GET ДИАГНОСТИКА: извлекает условие ошибки и параметры сообщения условия ошибки,
SQLSTATEперехваченного обработчиком.
Питон
Для Python используется pySparkException
-
PySparkException.getErrorClass(): возвращает условие ошибки исключения в виде строки. -
PySparkException.getMessageParameters(): возвращает параметры сообщения исключения в виде словаря. -
PySparkException.getSqlState(): возвращаетSQLSTATEвыражение в виде строки.
язык программирования Scala
Для Scala используйте SparkThrowable
-
getErrorClass(): возвращает условие ошибки в виде строки. -
getMessageParameters(): возвращает параметры сообщения в виде карты. -
getSqlState(): возвращаетSQLSTATEв виде строки.
Примеры
Перехват любого исключения и отображение условия ошибки, параметров сообщения и
SQLSTATE. Также отображается сообщение об ошибке по умолчаниюSQL
BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN DECLARE error_condition STRING; DECLARE sqlstate STRING; DECLARE msg_args MAP<STRING, STRING>; DECLARE msg STRING; GET DIAGNOSTICS CONDITION 1 error_condition = CONDITION_IDENTIFIER, sqlstate = RETURNED_SQLSTATE, msg_args = MESSAGE_ARGUMENTS, msg = MESSAGE_TEXT; VALUES('Error Condition : ' || error_condition ), ('Message arguments : ' || cast(msg_args AS STRING)), ('SQLSTATE : ' || sqlstate ), (msg ); END; SELECT * FROM does_not_exist; END;язык программирования Scala
import org.apache.spark.SparkThrowable try { spark.sql("SELECT * FROM does_not_exist").show() } catch { case ex: SparkThrowable => println("Error Condition : " + ex.getErrorClass) println("Message arguments : " + ex.getMessageParameters()) println("SQLSTATE : " + ex.getSqlState) println(ex) }Питон
from pyspark.errors import PySparkException try: spark.sql("SELECT * FROM does_not_exist").show() except PySparkException as ex: print("Error Condition : " + ex.getErrorClass()) print("Message arguments : " + str(ex.getMessageParameters())) print("SQLSTATE : " + ex.getSqlState()) print(ex)Результат
Error Condition : TABLE_OR_VIEW_NOT_FOUND Message arguments : {'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и отобразите пользовательское сообщение:SQL
BEGIN DECLARE EXIT HANDLER FOR SQLSTATE '42P01' BEGIN DECLARE msg_args MAP<STRING, STRING>; GET DIAGNOSTICS CONDITION 1 msg_args = MESSAGE_ARGUMENTS; VALUES('I\'m so sorry, but I cannot find: ' || msg_args['relationName']); END; SELECT * FROM does_not_exist; END;язык программирования 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")) }Питон
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и отобразите настраиваемое сообщение.SQL
BEGIN DECLARE EXIT HANDLER FOR TABLE_OR_VIEW_NOT_FOUND BEGIN DECLARE msg_args MAP<STRING, STRING>; GET DIAGNOSTICS CONDITION 1 msg_args = MESSAGE_ARGUMENTS; VALUES('I\'m so sorry, but I cannot find: ' || msg_args['relationName']); END; SELECT * FROM does_not_exist; END;язык программирования 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")) }Питон
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