Pular para o conteúdo principal

Tratamento de erros na Databricks

Aplica-se a: cheque marcado sim Databricks SQL cheque marcado sim Databricks Runtime 12.2e acima

Componentes de erro

Quando o Databricks gera um erro, ele inclui os seguintes componentes:

  • Classe de erro

    Uma cadeia de caracteres descritiva, legível por humanos, exclusiva da condição de erro.

    Algumas classes de erro incluem subclasses.

    Por exemplo: TABLE_OR_VIEW_NOT_FOUND e INCOMPLETE_TYPE_DEFINITION.ARRAY.

    Para obter uma lista de todas as classes de erro, consulte Classes de erro.

  • SQLSTATE

    Uma cadeia longa de cinco caracteres que agrupa as classes de erro em um formato padrão compatível com muitos produtos e APIs.

    Por exemplo: '42P01'

    Para obter uma lista completa de todos os SQLSTATEs usados pelo Databricks, consulte SQLSTATEs.

  • Mensagem parametrizada

    A mensagem de erro com espaços reservados para os parâmetros.

    Por exemplo: TABLE_OR_VIEW_NOT_FOUND inclui a seguinte mensagem:

    The table or view <relationName> cannot be found.

    Você pode usar a mensagem parametrizada para renderizar uma mensagem de erro mapeando os valores dos parâmetros da mensagem para as tags de parâmetros <parameter>.

  • Parâmetros da mensagem

    Um mapa de parâmetros e valores que fornecem informações adicionais sobre o erro. Por exemplo: 'relationName' -> 'main.default.tab1'.

  • Mensagem

    A mensagem de erro totalmente renderizada, incluindo a classe de erro e o SQLSTATE, com os parâmetros preenchidos. Por exemplo:

    [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
atenção

A mensagem e a mensagem parametrizada não são estáveis em todas as versões. O texto da mensagem pode ser alterado ou localizado sem aviso prévio. Para lidar programaticamente com uma condição de erro, use a Classe de Erro , SQLSTATE e os Parâmetros de Mensagem .

Tratamento de condições de erro

Aplica-se a: cheque marcado sim Databricks SQL cheque marcado sim Databricks Runtime 14.2 e acima

info

Visualização

Esse recurso está em Public Preview.

A Databricks fornece APIs específicas de linguagem para lidar com condições de erro.

Python

Para Python, use pySparkException

  • PySparkException.getErrorClass() : Retorna a classe de erro da exceção como uma cadeia de caracteres.
  • PySparkException.getMessageParameters() : Retorna os parâmetros da mensagem da exceção como um dicionário.
  • PySparkException.getSqlState() : Retorna o endereço SQLSTATE da expressão como uma cadeia de caracteres.

Scala

Para Scala, use SparkThrowable

  • getErrorClass() : Retorna uma classe de erro como uma cadeia de caracteres.
  • getMessageParameters() : Retorna os parâmetros de uma mensagem como um mapa.
  • getSqlState() : Retorna um SQLSTATE como uma cadeia de caracteres.

Exemplos

  • Capture qualquer exceção e exiba a classe de erro, os parâmetros da mensagem e SQLSTATE. Exibir também a mensagem de erro default
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)
}

Resultado

  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
  • Pegue somente o SQLSTATE 42P01 e exiba uma mensagem personalizada:
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"))
}

Resultado

I'm so sorry, but I cannot find: `does_not_exist`
  • Capture somente a classe de erro TABLE_OR_VIEW_NOT_FOUND e exiba uma mensagem personalizada:
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"))
}

Resultado

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

Exceções levantadas pelo usuário

O Databricks fornece as seguintes funções para gerar erros definidos pelo usuário:

  • aumentar_erro

    Gera uma exceção com uma mensagem de erro personalizada.

  • assert_true

    Gera um erro com uma mensagem de erro opcional, se uma condição não for atendida.

Ambas as funções retornam a classe de erro 'USER_RAISED_EXCEPTION' e a SQLSTATE 'P0001' junto com uma mensagem definida pelo usuário.

Exemplos

> 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

Relacionado