エラーメッセージガイドライン

このガイドは、Apache Spark で標準化され、実行可能なエラーメッセージを作成するためのリファレンスです。

何が、なぜ、どのように を含める

Spark からスローされる例外は、「5W1H」に答える必要があります。

  • が問題に遭遇しましたか?
  • が問題でしたか?
  • いつ 問題が発生しましたか?
  • どこで 問題が発生しましたか?
  • なぜ 問題が発生しましたか?
  • どのように 問題を解決できますか?

例外によって提供されるコンテキストは、 (通常はユーザー)、いつ (通常は log4j を介したログに含まれる)、そして どこ (通常はスタックトレースに含まれる) に答えるのに役立ちます。しかし、これらの回答だけでは、ユーザーが問題を解決するには不十分な場合が多くあります。なぜ、そして どのように という残りの質問に答えるエラーメッセージは、ユーザーのフラストレーションを最小限に抑えます。

何、なぜ、どのように を明示的に回答する

多くの場合、エラーメッセージは なぜ、そして どのように に明示的に答えるべきです。

例 1

そのクラスが定義されたスコープへのアクセスなしに、内部クラス {} のエンコーダーを生成できません。このクラスを親クラスの外に移動してみてください。

  • 何: 内部クラスのエンコーダーを生成できません。
  • なぜ: クラスが定義されたスコープへのアクセスがありませんでした。
  • どのように: このクラスを親クラスの外に移動してみてください。
例 2

提案された修正 (どのように) が恣意的だと感じる場合、なぜ エラーが発生したかの説明を提供することで、ユーザーのフラストレーションを軽減できます。

修正前

サポートされていない 関数名 {}。

  • 何: サポートされていない関数名。
  • なぜ: 不明。
  • どのように: 不明。

修正後

関数名 {} は 無効です。一時関数はカタログに属することはできません。1 つまたは 2 つの部分からなる関数名を指定してください。

  • 何: 無効な関数名。
  • なぜ: 一時関数はカタログに属することはできません。
  • どのように: 1 つまたは 2 つの部分からなる関数名を指定してください。

どのように を暗黙的に回答する

すべてのエラーメッセージがこれほど冗長である必要はありません。場合によっては、問題を解決する 方法 を明示的に説明することが冗長になることがあります。この場合、明示的な説明を省略できます。

例 1

無効なピボット列 {}。ピボット列は比較可能である必要があります。

  • 何: 無効なピボット列。
  • なぜ: ピボット列は比較可能である必要があります。
  • どのように (なぜ から推測): 比較可能なピボット列を使用してください。
例 2

修正前

{} 関数にウィンドウフレームを指定できません

  • 何: 関数にウィンドウフレームを指定できません。
  • なぜ: 不明。
  • どのように: 不明。

修正後

ウィンドウ式 {} のフレームを指定できません。 ウィンドウ式には、関数フレーム {} と指定フレーム {} の間に不一致があります。

  • 何: ウィンドウ式のフレームを指定できません。
  • なぜ: ウィンドウ式には、関数フレームと指定フレームの間に不一致があります。
  • どのように (なぜ から推測): 関数フレームと指定フレームを一致させてください。
例 3

修正前

10 進数を解析できません。

  • 何: 10 進数を解析できません。
  • なぜ: 不明。
  • どのように: 不明。

修正後

無効な 10 進数 {}; 位置 {} で解析中にエラーが発生しました。

  • 何: 無効な 10 進数。
  • なぜ: 10 進数パーサーが指定された位置でエラーを検出しました。
  • どのように (なぜ から推測): 指定された位置のエラーを修正してください。

なぜ と どのように を暗黙的に回答する

場合によっては、なぜ 問題が発生したかを明示的に説明することが冗長になることがあります。この場合、明示的な説明を省略できます。

パスが存在しません: {}

  • 何: パスが存在しません。
  • なぜ (何 から推測): ユーザーが無効なパスを指定しました。
  • どのように (何 から推測): 別のパスを使用してください。

明確な言葉遣いを使用する

用語集

フレーズ 使用時期
サポートされていない ユーザーは合理的に操作がサポートされていると想定するかもしれませんが、実際にはサポートされていません。開発者が操作のサポートを追加した場合、このエラーは将来消える可能性があります。 データ型 {} は サポートされていません
無効 / 許可されない / 予期しない ユーザーが操作の指定で間違いを犯しました。メッセージは、ユーザーにエラーの解決方法を通知する必要があります。 配列のサイズが {}、インデックス {} は 無効 です。
句 {} に対して 1 つのジェネレーターが見つかりました。 1 つのジェネレーターのみ許可されます。
予期しない状態フォーマットバージョン {} が見つかりました。バージョン 1 または 2 が期待されていました。
失敗しました システムは、ユーザーのエラーに合理的に起因しない予期しないエラーに遭遇しました。 コンパイルに失敗しました {}。
できない いつでも、できれば上記の代替手段のいずれも適用されない場合にのみ。 サポートされていない 型 {} のコードを生成できません。

文言ガイド

ベストプラクティス 修正前 修正後
能動態を使用する データ型 {} は {} で サポートされていません {} はデータ型 {} を サポートしていません
将来のサポートの約束など、時間に基づいた記述を避ける Pandas UDF 集約式は、現在ピボットではサポートされていません。 ピボットは Pandas UDF 集約式を サポートしていません
Parquet 型が まだ サポートされていません: {}. {} は Parquet 型を サポートしていません
現在形を使用してエラーを説明し、提案を行う {} の参照列を {} で 見つけられませんでした {} の参照列を {} で 見つけられません
結合戦略ヒントパラメータは、識別子または文字列である必要がありますが、{} でした。 結合戦略ヒントパラメータ {} は使用できません。 テーブル名または識別子を使用して パラメータを指定してください。
解決策が不明確な場合は、具体的な例を提供する {} ヒントは、パーティション番号をパラメータとして期待します。 {} ヒントは、パーティション番号をパラメータとして期待します。 例えば、{} (3) で 3 つのパーティションを指定してください。
非難的、審判的、または侮辱的に聞こえることを避ける {} の金額を 指定する必要があります {} は空にできません。{} の金額を指定してください。
直接的になる LEGACY ストア割り当てポリシーは、Spark データソース V2 では許可されていません。 設定 spark.sql.storeAssignmentPolicy を他の値に設定してください。 Spark データソース V2 は、LEGACY ストア割り当てポリシーを許可しません。設定 spark.sql.storeAssignment を ANSI または STRICT に設定してください。
ユーザー向けのメッセージにプログラミング用語を使用しない テーブル名の変更 のソースと宛先のデータベースが一致しません: '{}' != '{}'。 テーブル名の変更 のソースと宛先のデータベースが一致しません。ソースデータベースは {} ですが、宛先データベースは {} です。