다음을 통해 공유


Azure Databricks에서 오류 처리

적용 대상:검사 '예'로 표시 Databricks SQL 검사 '예'로 표시 Databricks Runtime 12.2 이상

오류 구성 요소

Azure Databricks에서 오류가 발생하면 다음 구성 요소가 포함됩니다.

  • 오류 클래스

    오류 조건에 고유한 설명적이고 사람이 읽을 수 있는 문자열입니다.

    일부 오류 클래스에는 하위 클래스가 포함됩니다.

    예: 'TABLE_OR_VIEW_NOT_FOUND''INCOMPLETE_TYPE_DEFINITION. ARRAY'.

    모든 오류 클래스 목록은 오류 클래스를 참조 하세요.

  • Sqlstate

    오류 클래스를 여러 제품 및 API에서 지원하는 표준 형식으로 그룹화한 5자 길이의 문자열입니다.

    예: '42P01'

    Azure Databricks에서 사용하는 모든 SQLSTATE항목의 전체 목록은 SQLSTATEs를 참조 하세요.

  • 매개 변수가 있는 메시지

    매개 변수에 대한 자리 표시자가 있는 오류 메시지입니다.

    예: 'TABLE_OR_VIEW_NOT_FOUND' 에는 다음 메시지가 포함됩니다.

    The table or view <relationName> cannot be found.
    

    매개 변수가 있는 메시지를 사용하여 메시지 매개 변수 값을 매개 변수 태그에 매핑하여 오류 메시지를 렌더링할 수 있습니다 <parameter>.

  • 메시지 매개 변수

    오류에 대한 추가 정보를 제공하는 매개 변수 및 값의 맵입니다. 예: 'relationName' -> 'main.default.tab1'

  • Message

    매개 변수가 채워진 오류 클래스 및 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
    

Warning

메시지매개 변수가 있는 메시지는 릴리스에서 안정적이지 않습니다. 메시지 텍스트는 예고 없이 변경되거나 지역화될 수 있습니다. 오류 조건을 프로그래밍 방식으로 처리하려면 대신 오류 클래스 및 메시지 매개 변수를 사용합니다.SQLSTATE

오류 조건 처리

적용 대상: 검사 '예'로 표시 Databricks SQL 검사 '예'로 표시 Databricks Runtime 14.2 이상

Important

이 기능은 공개 미리 보기 상태입니다.

Azure Databricks는 오류 조건을 처리하기 위한 언어별 API를 제공합니다.

Python

Python의 경우 pySparkException 사용

  • PySparkException.getErrorClass(): 예외의 오류 클래스를 문자열로 반환합니다.
  • PySparkException.getMessageParameters(): 예외의 메시지 매개 변수를 사전으로 반환합니다.
  • PySparkException.getSqlState(): 식의 SQLSTATE 문자열을 반환합니다.

Scala

Scala의 경우 SparkThrowable 사용

  • getErrorClass(): 오류 클래스를 문자열로 반환합니다.
  • getMessageParameters(): 메시지 매개 변수를 맵으로 반환합니다.
  • getSqlState(): SQLSTATE를 문자열로 반환합니다.

예제

  • 예외를 catch하고 오류 클래스, 메시지 매개 변수 및 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 만 catch하고 사용자 지정 메시지를 표시합니다.

    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 만 catch하고 사용자 지정 메시지를 표시합니다.

    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