Aracılığıyla paylaş


Azure Databricks'te hata işleme

Şunlar için geçerlidir:onay işareti evet olarak işaretlenmiş Databricks SQL onay işareti evet olarak işaretlenmiş Databricks Runtime 12.2 ve üzeri

Hata bileşenleri

Azure Databricks bir hata yükselttiğinde aşağıdaki bileşenleri içerir:

  • Hata Durumu

    Hata koşuluna özgü açıklayıcı, insan tarafından okunabilir bir dize.

    Bazı hata koşulları alt koşulları içerir.

    Örneğin: TABLE_OR_VIEW_NOT_FOUND ve INCOMPLETE_TYPE_DEFINITION. DIZI.

    Tüm hata koşullarının listesi için bkz. Hata Koşulları.

  • SQLSTATE

    Hata koşullarını birçok ürün ve API tarafından desteklenen standart bir biçimde gruplandıran beş karakterlik uzun dize.

    Örneğin: '42P01'

    Azure Databricks tarafından kullanılan tüm SQLSTATEözelliklerin tam listesi için bkz . SQLSTATEs.

  • Parametreli İleti

    Parametreler için yer tutucuları içeren hata iletisi.

    Örneğin: TABLE_OR_VIEW_NOT_FOUND aşağıdaki iletiyi içerir:

    The table or view <relationName> cannot be found.
    

    İleti parametre değerlerini parametre etiketleriyle <parameter>eşleyerek hata iletisini işlemek için parametreli iletiyi kullanabilirsiniz.

  • İleti Parametreleri

    Hata hakkında ek bilgi sağlayan parametrelerin ve değerlerin haritası. Örneğin: 'relationName' -> 'main.default.tab1'.

  • İleti

    Tamamen işlenmiş hata iletisi, hata koşulunu ve SQLSTATE'yu içerecek şekilde, parametreleri doldurulmuş olarak. Örneğin:

    [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
    

Uyarı

İleti ve Parametreli İleti sürümler arasında kararlı değildir. İleti metni bildirimde bulunmaksızın değiştirilebilir veya yerelleştirilebilir. Bir hata koşulunu program aracılığıyla işlemek için bunun yerine Hata Koşulu, SQLSTATEve İleti Parametreleri'ni kullanın.

Hata koşullarını işleme

Şunlar için geçerlidir: onay işareti evet olarak işaretlenmiş Databricks SQL onay işareti evet olarak işaretlenmiş Databricks Runtime 14.2 ve üzeri

Önemli

Bu özellik Genel Önizlemededir.

Azure Databricks, hata koşullarını işlemek için dile özgü API'ler sağlar.

SQL

Uygulandığı yer: evet işaretli Databricks SQL evet işaretli Databricks Runtime 16.3 ve üzeri

SQL için, koşul işleyicilerini tanımlamak için bileşik deyim söz dizimini kullanın.

  • DECLARE EXIT HANDLER: Belirtilen hata koşulları, SQLSTATEs veya herhangi SQLEXCEPTIONbir kümesi için bir işleyici tanımlar.
  • GET TANıLAMA: İşleyici tarafından kesilen hata koşulunun hata koşulunu, SQLSTATEve ileti parametrelerini alır.

Piton

Python için pySparkException kullanın

  • PySparkException.getErrorClass(): Özel durumun hata koşulunu dize olarak döndürür.
  • PySparkException.getMessageParameters(): Özel durumun ileti parametrelerini sözlük olarak döndürür.
  • PySparkException.getSqlState(): İfadenin dize olarak değerini döndürür SQLSTATE .

Scala programlama dili

Scala için SparkThrowable kullanın

  • getErrorClass(): Dize olarak bir hata koşulu döndürür.
  • getMessageParameters(): Bir ileti parametresini harita olarak döndürür.
  • getSqlState(): SQLSTATE öğesini dize olarak döndürür.

Örnekler

  • Herhangi bir özel durumu yakalayın ve hata koşulunu, ileti parametrelerini ve SQLSTATEgörüntüleyin. Varsayılan hata iletisini de görüntüleme

    SQL

    BEGIN
      DECLARE EXIT HANDLER FOR SQLEXCEPTION
        BEGIN
          DECLARE error_condition STRING;
          DECLARE sqlstate STRING;
          DECLARE msg_args MAP<STRING, STRING>;
          DECLARE msg STRING;
    
          GET DIAGNOSTICS CONDITION 1
            error_condition = CONDITION_IDENTIFIER,
            sqlstate        = RETURNED_SQLSTATE,
            msg_args        = MESSAGE_ARGUMENTS,
            msg             = MESSAGE_TEXT;
    
          VALUES('Error Condition   : ' || error_condition         ),
                ('Message arguments : ' || cast(msg_args AS STRING)),
                ('SQLSTATE          : ' || sqlstate                ),
                (msg                                               );
        END;
      SELECT * FROM does_not_exist;
    END;
    

    Scala programlama dili

    import org.apache.spark.SparkThrowable
    
    try {
      spark.sql("SELECT * FROM does_not_exist").show()
    }
    catch {
      case ex: SparkThrowable =>
        println("Error Condition   : " + ex.getErrorClass)
        println("Message arguments : " + ex.getMessageParameters())
        println("SQLSTATE          : " + ex.getSqlState)
        println(ex)
    }
    

    Piton

    from pyspark.errors import PySparkException
    
    try:
      spark.sql("SELECT * FROM does_not_exist").show()
    except PySparkException as ex:
      print("Error Condition   : " + ex.getErrorClass())
      print("Message arguments : " + str(ex.getMessageParameters()))
      print("SQLSTATE          : " + ex.getSqlState())
      print(ex)
    

    Sonuç

      Error Condition   : TABLE_OR_VIEW_NOT_FOUND
      Message arguments : {'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
    
  • Yalnızca SQLSTATE'i 42P01 yakalayın ve özel bir ileti görüntüleyin:

    SQL

    BEGIN
      DECLARE EXIT HANDLER FOR SQLSTATE '42P01'
        BEGIN
          DECLARE msg_args MAP<STRING, STRING>;
          GET DIAGNOSTICS CONDITION 1 msg_args = MESSAGE_ARGUMENTS;
          VALUES('I\'m so sorry, but I cannot find: ' || msg_args['relationName']);
        END;
      SELECT * FROM does_not_exist;
    END;
    

    Scala programlama dili

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

    Piton

    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
    

    Sonuç

    I'm so sorry, but I cannot find: `does_not_exist`
    
  • Yalnızca hata koşulunu TABLE_OR_VIEW_NOT_FOUND yakalayın ve özel bir ileti görüntüleyin:

    SQL

    BEGIN
      DECLARE EXIT HANDLER FOR TABLE_OR_VIEW_NOT_FOUND
        BEGIN
          DECLARE msg_args MAP<STRING, STRING>;
          GET DIAGNOSTICS CONDITION 1 msg_args = MESSAGE_ARGUMENTS;
          VALUES('I\'m so sorry, but I cannot find: ' || msg_args['relationName']);
        END;
      SELECT * FROM does_not_exist;
    END;
    

    Scala programlama dili

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

    Piton

    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
    

    Sonuç

    I'm so sorry, but I cannot find: `does_not_exist`
    

Kullanıcı tarafından tetiklenen özel durumlar

Azure Databricks, kullanıcı tanımlı hataları tetikleyen aşağıdaki işlevleri sağlar:

  • hata_kaldır

    Özel hata iletisiyle bir özel durum oluşturur.

  • assert_true

    Bir koşul karşılanmazsa isteğe bağlı bir hata iletisiyle hata oluşturur.

Her iki işlev de 'USER_RAISED_EXCEPTION' hata koşulunu SQLSTATE'P0001' ve kullanıcı tanımlı bir iletiyi döndürür.

Örnekler

> 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