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

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
警告

メッセージパラメータ化メッセージは 、リリース間で安定していません。メッセージテキストは予告なしに変更またはローカライズされる場合があります。エラー状態をプログラムで処理するには、代わりに Error ClassSQLSTATE 、および Message パラメーター を使用します。

エラー条件の処理

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

備考

プレビュー

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

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

Python

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

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

結果

  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"))
}

結果

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"))
}

結果

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

関連