Foutafhandeling in Azure Databricks

Van toepassing op:check marked yes Databricks SQL check marked yes Databricks Runtime 12.2 en hoger

Foutonderdelen

Wanneer Azure Databricks een fout genereert, bevat deze de volgende onderdelen:

  • Foutklasse

    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.

  • SQLSTATE

    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 SQLSTATEs 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: check marked yes Databricks SQL check marked yes 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 de SQLSTATE 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 weergeven

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

    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:

  • raise_error

    Hiermee wordt een uitzondering gegenereerd met een aangepast foutbericht.

  • assert_true

    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