メインコンテンツまでスキップ

Databricks でのエラー処理

適用対象: チェックマークが Yes Databricks SQL チェックマークが Yes Databricks Runtime 12.2 以降

エラーコンポーネント

Databricks でエラーが発生すると、次のコンポーネントが含まれます。

  • エラー状態

    エラー条件に固有の、説明的で人間が読める文字列。

    一部のエラー条件には、サブ条件が含まれます。

    たとえば、 TABLE_OR_VIEW_NOT_FOUNDINCOMPLETE_TYPE_DEFINITIONなどです。配列

    すべてのエラー条件の一覧については 、「エラー条件」を参照してください。

  • SQLSTATE の

    エラー状態を多くの製品や APIsでサポートされている標準形式にグループ化した 5 文字の文字列。

    例えば: '42P01'

    Databricks で使用されるすべての SQLSTATEの完全な一覧については、「 SQLSTATE」を参照してください。

  • パラメータ化されたメッセージ

    パラメーターのプレースホルダーを含むエラー メッセージ。

    たとえば、 TABLE_OR_VIEW_NOT_FOUND には次のメッセージが含まれます。

    The table or view <relationName> cannot be found.

    パラメーター化されたメッセージを使用して、メッセージ・パラメーター値をパラメーター・タグ <parameter>にマッピングすることにより、エラー・メッセージをレンダリングできます。

  • Message パラメーター

    エラーに関する追加情報を提供するパラメーターと値のマップ。たとえば、 '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およびメッセージ パラメーター を使用します。

エラー条件の処理

適用対象: チェックマークが Yes Databricks SQL チェックマークが Yes Databricks Runtime 14.2 以降

備考

プレビュー

この機能は パブリック プレビュー段階です。

Databricks では、エラー状態を処理するための言語固有の APIs を提供します。

SQL

適用対象: チェックマークが Yes Databricks Runtime 16.3 以降

SQL の場合は、 複合ステートメント 構文を使用して条件ハンドラを定義します。

  • DECLARE EXIT HANDLER: 指定されたエラー条件のセット、 SQLSTATE、または任意の SQLEXCEPTIONのハンドラを定義します。
  • GET DIAGNOSTICS: ハンドラーによってインターセプトされたエラー条件のエラー条件、 SQLSTATE、およびメッセージパラメーターを取得します。

Python

Python の場合は pySparkException を使用します

  • PySparkException.getErrorClass() : 例外のエラー状態を文字列として返します。
  • PySparkException.getMessageParameters() : 例外の message パラメーターをディクショナリとして返します。
  • 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;

結果

  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;

結果

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;

結果

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

ユーザーから発生した例外

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

関連