Foutafhandeling in Azure Databricks
Van toepassing op: Databricks SQL Databricks Runtime 12.2 en hoger
Foutonderdelen
Wanneer Azure Databricks een fout genereert, bevat deze de volgende onderdelen:
-
Een beschrijvende, door mensen leesbare tekenreeks die uniek is voor de foutvoorwaarde.
Sommige foutklassen zijn sublasses.
Bijvoorbeeld: TABLE_OR_VIEW_NOT_FOUND en INCOMPLETE_TYPE_DEFINITION. MATRIX.
Zie Foutklassen voor een lijst met alle foutklassen.
-
Een lange tekenreeks met vijf tekens, waarbij foutklassen worden gegroepeerd in een standaardindeling die wordt ondersteund door veel producten en API's.
Bijvoorbeeld:
'42P01'
Zie SQLSTATEs voor een volledige lijst met alle
SQLSTATE
s die door Azure Databricks worden gebruikt. Geparameteriseerd bericht
Het foutbericht met tijdelijke aanduidingen voor de parameters.
Bijvoorbeeld: TABLE_OR_VIEW_NOT_FOUND bevat het volgende bericht:
The table or view <relationName> cannot be found.
U kunt het bericht met parameters gebruiken om een foutbericht weer te geven door berichtparameterwaarden toe te voegen aan de parametertags
<parameter>
.Berichtparameters
Een kaart met parameters en waarden die aanvullende informatie geven over de fout. Voorbeeld:
'relationName' -> 'main.default.tab1'
.Bericht
Het volledig weergegeven foutbericht, inclusief de foutklasse en de
SQLSTATE
, met de parameters ingevuld. Voorbeeld:[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
Waarschuwing
Bericht en geparameteriseerd bericht zijn niet stabiel in releases.
De berichttekst kan zonder kennisgeving worden gewijzigd of gelokaliseerd.
Als u programmatisch een foutvoorwaarde wilt afhandelen, gebruikt u de foutklasseSQLSTATE
en de berichtparameters.
Foutvoorwaarden verwerken
Van toepassing op: Databricks SQL Databricks Runtime 14.2 en hoger
Belangrijk
Deze functie is beschikbaar als openbare preview.
Azure Databricks biedt taalspecifieke API's voor het afhandelen van foutvoorwaarden.
Python
Voor Python gebruikt u pySparkException
PySparkException.getErrorClass()
: retourneert de foutklasse van de uitzondering als een tekenreeks.PySparkException.getMessageParameters()
: retourneert de berichtparameters van de uitzondering als een woordenlijst.PySparkException.getSqlState()
: retourneert deSQLSTATE
expressie als een tekenreeks.
Scala
Gebruik SparkThrowable voor Scala
getErrorClass()
: retourneert een foutklasse als een tekenreeks.getMessageParameters()
: retourneert een berichtparameters als een kaart.getSqlState()
: retourneert een SQLSTATE als een tekenreeks.
Voorbeelden
Neem een uitzondering op en geef foutklasse, berichtparameters en
SQLSTATE
. Ook het standaardfoutbericht weergevenScala
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)
Resultaat
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
Alleen de SQLSTATE
42P01
vangen en een aangepast bericht weergeven: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
Resultaat
I'm so sorry, but I cannot find: `does_not_exist`
Alleen de foutklasse
TABLE_OR_VIEW_NOT_FOUND
ondervangen en een aangepast bericht weergeven: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
Resultaat
I'm so sorry, but I cannot find: `does_not_exist`
Gebruiker heeft uitzonderingen gegenereerd
Azure Databricks biedt de volgende functies voor het genereren van door de gebruiker gedefinieerde fouten:
-
Hiermee wordt een uitzondering gegenereerd met een aangepast foutbericht.
-
Er wordt een fout gegenereerd met een optioneel foutbericht als niet aan een voorwaarde wordt voldaan.
Beide functies retourneren de foutklasse 'USER_RAISED_EXCEPTION' en het SQLSTATE
'P0001'
samen met een door de gebruiker gedefinieerd bericht.
Voorbeelden
> 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