Поделиться через


Обработка ошибок в Azure Databricks

Область применения:флажок Databricks SQL флажок Databricks Runtime 12.2 и более поздних версий

Компоненты ошибок

Когда Azure Databricks вызывает ошибку, она включает следующие компоненты:

  • Класс ошибок

    Описательная, читаемая человеком строка, уникальная для условия ошибки.

    Некоторые классы ошибок включают вложенные очки.

    Например, TABLE_OR_VIEW_NOT_FOUND и INCOMPLETE_TYPE_DEFINITION. МАССИВ.

    Для получения списка всех классов ошибок см. раздел Error Classes.

  • SQLSTATE

    Пятизначная длинная строка, группирование классов ошибок в стандартный формат, поддерживаемый многими продуктами и 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
    

Предупреждение

Сообщение и параметризованное сообщение не являются стабильными в разных выпусках. Текст сообщения может быть изменен или локализован без уведомления. Для программной обработки условия ошибки используйтекласса ошибок , и параметры сообщения.

Обработка условий ошибок

Область применения: флажок Databricks SQL флажок Databricks Runtime 14.2 и более поздних версий

Внимание

Эта функция предоставляется в режиме общедоступной предварительной версии.

Azure Databricks предоставляет интерфейсы API для обработки ошибок на языке.

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 предоставляет следующие функции для создания определяемых пользователем ошибок:

  • raise_error

    Вызывает исключение с пользовательским сообщением об ошибке.

  • assert_true

    Вызывает ошибку с необязательным сообщением об ошибке, если условие не выполнено.

Обе функции возвращают класс ошибок "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