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 Sınıfı

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

    Bazı hata sınıfları alt bileşenler içerir.

    Örneğin: 'TABLE_OR_VIEW_NOT_FOUND', ' INCOMPLETE_TYPE_DEFINITION. DIZI'.

    Tüm hata sınıflarının listesi için bkz. Hata Sınıfları.

  • SQLSTATE

    Hata sınıfları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

    Hata sınıfı ve SQLSTATEparametreleri doldurulmuş olarak dahil olmak üzere tamamen işlenmiş hata iletisi. Ö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 Sınıfı, 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.

Python

Python için pySparkException kullanın

  • PySparkException.getErrorClass(): Özel durumun hata sınıfını 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

Scala için SparkThrowable kullanın

  • getErrorClass(): Dize olarak bir hata sınıfı döndürür.
  • getMessageParameters(): Bir ileti parametresini harita olarak döndürür.
  • getSqlState(): SQLSTATE'i dize olarak döndürür.

Örnekler

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

    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)
    

    Sonuç

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

    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
    

    Sonuç

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

    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
    

    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:

  • raise_error

    Ö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 sınıfını'P0001'SQLSTATEve 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