Felhantering i Azure Databricks
Gäller för: Databricks SQL Databricks Runtime 12.2 och senare
Felkomponenter
När Azure Databricks genererar ett fel innehåller det följande komponenter:
-
En beskrivande, läsbar sträng som är unik för felvillkoret.
Vissa felklasser omfattar underpunkter.
Till exempel: TABLE_OR_VIEW_NOT_FOUND och INCOMPLETE_TYPE_DEFINITION. MATRIS.
En lista över alla felklasser finns i Felklasser.
-
En fem tecken lång sträng som grupperar felklasser i ett standardformat som stöds av många produkter och API:er.
Till exempel:
'42P01'
En fullständig lista över alla
SQLSTATE
som används av Azure Databricks finns i SQLSTATEs. Parameteriserat meddelande
Felmeddelandet med platshållare för parametrarna.
Exempel: TABLE_OR_VIEW_NOT_FOUND innehåller följande meddelande:
The table or view <relationName> cannot be found.
Du kan använda det parametriserade meddelandet för att återge ett felmeddelande genom att mappa parametervärden för meddelanden till parametertaggar
<parameter>
.Meddelandeparametrar
En karta över parametrar och värden som ger ytterligare information om felet. Exempel:
'relationName' -> 'main.default.tab1'
.Meddelande
Det fullständigt renderade felmeddelandet, inklusive felklassen
SQLSTATE
och , med parametrarna ifyllda. Till exempel:[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
Varning
Meddelandet och det parametriserade meddelandet är inte stabila i olika versioner.
Meddelandetexten kan ändras eller lokaliseras utan föregående meddelande.
Om du vill hantera ett feltillstånd programmatiskt använder du felklassen , SQLSTATE
och meddelandeparametrar i stället.
Hantera feltillstånd
Gäller för: Databricks SQL Databricks Runtime 14.2 och senare
Viktigt!
Den här funktionen finns som allmänt tillgänglig förhandsversion.
Azure Databricks tillhandahåller språkspecifika API:er för att hantera feltillstånd.
Python
För Python använder du pySparkException
PySparkException.getErrorClass()
: Returnerar felklassen för undantaget som en sträng.PySparkException.getMessageParameters()
: Returnerar meddelandeparametrarna för undantaget som en ordlista.PySparkException.getSqlState()
: ReturnerarSQLSTATE
uttrycket som en sträng.
Scala
För Scala använder du SparkThrowable
getErrorClass()
: Returnerar en felklass som en sträng.getMessageParameters()
: Returnerar en meddelandeparametrar som en karta.getSqlState()
: Returnerar en SQLSTATE som en sträng.
Exempel
Fånga eventuella undantags- och visningsfelklasser, meddelandeparametrar och
SQLSTATE
. Visa även standardfelmeddelandetScala
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) }
Python
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)
Result
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
Fånga endast SQLSTATE
42P01
och visa ett anpassat meddelande: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")) }
Python
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
Result
I'm so sorry, but I cannot find: `does_not_exist`
Fånga endast felklassen
TABLE_OR_VIEW_NOT_FOUND
och visa ett anpassat meddelande: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")) }
Python
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
Result
I'm so sorry, but I cannot find: `does_not_exist`
Användarinsamlade undantag
Azure Databricks tillhandahåller följande funktioner för att skapa användardefinierade fel:
-
Genererar ett undantag med ett anpassat felmeddelande.
-
Genererar ett fel med ett valfritt felmeddelande om ett villkor inte uppfylls.
Båda funktionerna returnerar felklassen "USER_RAISED_EXCEPTION" och SQLSTATE
'P0001'
tillsammans med ett användardefinierat meddelande.
Exempel
> 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