1. 오류 구성 요소

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

- Error Class (오류 클래스)

에러 상황들을 클래스로 정리한 것입니다. 

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

예시: ‘TABLE_OR_VIEW_NOT_FOUND’,  ‘INCOMPLETE_TYPE_DEFINITION.ARRAY’

모든 error class는 Error Classes 해당 문서에서 확인 가능 

- SQLSTATE

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

예시: '42P01'

SQLSTATEDatabricks 에서 사용하는 모든 목록은  SQLSTATE 해당 문서에서 확인 가능

- Parameterized Message (매개변수화된 메시지)

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

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

The table or view <relationName> cannot be found.

메시지 매개변수 값을 매개변수 태그에 매핑하여 오류 메시지를 렌더링 할 수 있습니다. 

- Message Parameters (메시지 매개변수)

오류에 대한 추가 정보를 제공하는 매개변수 및 값의 맵입니다.

예시: '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

 

2. 오류 조건 처리

databrick는 오류 조건을 처리하기 위해 파이썬, 스칼라에 API를 제공합니다.

- 파이썬

파이썬의 경우  pySparkException을 사용합니다. 

  • PysparkException.getErrorClass(): 오류 클래스를 문자열로 반환합니다.
  • PysparkException.getErrorClass(): 메시지 매개변수를 딕셔너리로 반환합니다.
  • PysparkException.getErrorClass(): SQLSTATE 표현식을 문자열로 반환합니다.

- 예시

1. 예외 발생시 오류 클래스, 메시지 매개변수 및 SQLSTATE, 기본 오류 메시지 출력

req

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)

res

  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

 

2. 예외 발생시 SQLSTATE 42P01만 포착하고 사용자 정의 메시지 표시

req

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

 

res

I'm so sorry, but I cannot find: `does_not_exist`

 

3. 오류 클래스 TABLE_OR_VIEW_NOT_FOUND 만 포착하고 사용자 정의 메시지 표시

req

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

res

I'm so sorry, but I cannot find: `does_not_exist`

 

3. 사용자 정의 예외

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
# 에러 메시지를 출력하고 SQLSTATAE 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

 


https://docs.databricks.com/en/error-messages/index.html

 

 

 

+ Recent posts