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