Usar métricas personalizadas com o Monitoramento do Databricks Lakehouse

Essa página descreve como criar uma métrica personalizada no Monitoramento do Databricks Lakehouse. Além das estatísticas de análise e descompasso calculadas automaticamente, você pode criar métricas personalizadas. Por exemplo, talvez você queira acompanhar uma média ponderada que capture algum aspecto da lógica de negócios ou use uma pontuação de qualidade de modelo personalizada. Você também pode criar métricas de descompasso personalizadas que acompanham as alterações nos valores na tabela primária (em comparação com a linha de base ou a janela de tempo anterior).

Para obter mais detalhes sobre como usar a API MonitorMetric, consulte a referência de API.

Tipos de métricas personalizadas

O Monitoramento do Databricks Lakehouse inclui os seguintes tipos de métricas personalizadas:

  • Métricas de agregação, que são calculadas com base em colunas na tabela primária. As métricas de agregação são armazenadas na tabela de métricas de perfil.
  • As métricas derivadas, que são calculadas com base em métricas de agregação calculadas anteriormente e não usam dados diretamente da tabela primária. As métricas derivadas são armazenadas na tabela de métricas de perfil.
  • Métricas de descompasso, que comparam métricas agregadas ou derivadas anteriormente de duas janelas de tempo diferentes ou entre a tabela primária e a tabela de linha de base. As métricas de descompasso são armazenadas na tabela de métricas de descompasso.

Usar métricas derivadas e descompasso sempre que possível minimiza a recomputação sobre a tabela primária completa. Somente métricas de agregação acessam dados da tabela primária. As métricas derivadas e de descompasso podem ser calculadas diretamente dos valores de métrica de agregação.

Parâmetros de métricas personalizadas

Para definir uma métrica personalizada, você cria um modelo Jinja para uma expressão de coluna SQL. As tabelas nesta seção descrevem os parâmetros que definem a métrica e os parâmetros usados no modelo Jinja.

Parâmetro Descrição
type Uma opção entre MonitorMetricType.CUSTOM_METRIC_TYPE_AGGREGATE, MonitorMetricType.CUSTOM_METRIC_TYPE_DERIVED ou MonitorMetricType.CUSTOM_METRIC_TYPE_DRIFT.
name Nome da coluna para a métrica personalizada em tabelas de métricas.
input_columns Lista de nomes de coluna na tabela de entrada para a qual a métrica deve ser computada. Para indicar que mais de uma coluna é usada no cálculo, use :table. Veja os exemplos nesse artigo.
definition Modelo Jinja para uma expressão SQL que especifica como calcular a métrica. Consulte Criar definição.
output_data_type Tipo de dados do Spark da saída da métrica em formato de cadeia de caracteres JSON.

Criar definition

O parâmetro definition deve ser uma única expressão de cadeia de caracteres na forma de um modeloJjinja. Ele não pode conter junções ou subconsultas.

A tabela a seguir lista os parâmetros que você pode usar para criar um Modelo Jinja do SQL para especificar como calcular a métrica.

Parâmetro Descrição
{{input_column}} Coluna usada para calcular a métrica personalizada.
{{prediction_col}} Previsões de modelo de ML de retenção de coluna. Usado com a análise InferenceLog.
{{label_col}} Rótulos de verdade do modelo de ML de retenção de coluna. Usado com a análise InferenceLog.
{{current_df}} Para descompasso em comparação com a janela de tempo anterior. Dados da janela de tempo anterior.
{{base_df}} Para descompasso em comparação com a tabela de linha de base. Dados de linha de base.

Exemplo de métrica de agregação

O exemplo a seguir calcula a média do quadrado dos valores em uma coluna e é aplicado às colunas f1 e f2. A saída é salva como uma nova coluna na tabela de métricas de perfil e é mostrada nas linhas de análise correspondentes às colunas f1 e f2. Os nomes de coluna aplicáveis são substituídos pelo parâmetro Jinja {{input_column}}.

from databricks.sdk.service.catalog import MonitorMetric, MonitorMetricType
from pyspark.sql import types as T

MonitorMetric(
    type=MonitorMetricType.CUSTOM_METRIC_TYPE_AGGREGATE,
    name="squared_avg",
    input_columns=["f1", "f2"],
    definition="avg(`{{input_column}}`*`{{input_column}}`)",
    output_data_type=T.StructField("output", T.DoubleType()).json(),
)

O código a seguir define uma métrica personalizada que calcula a média da diferença entre as colunas f1 e f2. Este exemplo mostra o uso de [":table"] no parâmetro input_columns para indicar que mais de uma coluna da tabela é usada no cálculo.

from databricks.sdk.service.catalog import MonitorMetric, MonitorMetricType
from pyspark.sql import types as T

MonitorMetric(
    type=MonitorMetricType.CUSTOM_METRIC_TYPE_AGGREGATE,
    name="avg_diff_f1_f2",
    input_columns=[":table"],
    definition="avg(f1 - f2)",
    output_data_type=T.StructField("output", T.DoubleType()).json(),
)

Esse exemplo calcula uma pontuação de qualidade de modelo ponderada. Para observações em que a coluna critical é True, uma penalidade mais pesada é atribuída quando o valor previsto para essa linha não corresponde à verdade do solo. Como ele é definido nas colunas brutas (prediction e label), ele é definido como uma métrica de agregação. A coluna :table indica que essa métrica é calculada a partir de várias colunas. Os parâmetros Jinja {{prediction_col}} e {{label_col}}são substituídos pelo nome das colunas de rótulo de verdade de previsão e de base para o monitor.

from databricks.sdk.service.catalog import MonitorMetric, MonitorMetricType
from pyspark.sql import types as T

MonitorMetric(
    type=MonitorMetricType.CUSTOM_METRIC_TYPE_AGGREGATE,
    name="weighted_error",
    input_columns=[":table"],
    definition="""avg(CASE
      WHEN {{prediction_col}} = {{label_col}} THEN 0
      WHEN {{prediction_col}} != {{label_col}} AND critical=TRUE THEN 2
      ELSE 1 END)""",
    output_data_type=T.StructField("output", T.DoubleType()).json(),
)

Exemplo de métrica derivada

O código a seguir define uma métrica personalizada que calcula a raiz quadrada da métrica squared_avg definida anteriormente nessa seção. Como essa é uma métrica derivada, ela não faz referência aos dados da tabela primária e, em vez disso, é definida em termos da métrica de agregação squared_avg. A saída é salva como uma nova coluna na tabela de métricas de perfil.

from databricks.sdk.service.catalog import MonitorMetric, MonitorMetricType
from pyspark.sql import types as T

MonitorMetric(
    type=MonitorMetricType.CUSTOM_METRIC_TYPE_DERIVED,
    name="root_mean_square",
    input_columns=["f1", "f2"],
    definition="sqrt(squared_avg)",
    output_data_type=T.StructField("output", T.DoubleType()).json(),
)

Exemplo de métricas de descompasso

O código a seguir define uma métrica de descompasso que acompanha a alteração na métrica weighted_error definida anteriormente nessa seção. Os parâmetros {{current_df}} e {{base_df}} permitem que a métrica referencie os valores weighted_error da janela atual e da janela de comparação. A janela de comparação pode ser os dados de linha de base ou os dados da janela de tempo anterior. As métricas de descompasso são salvas na tabela de métricas de descompasso.

from databricks.sdk.service.catalog import MonitorMetric, MonitorMetricType
from pyspark.sql import types as T

MonitorMetric(
    type=MonitorMetricType.CUSTOM_METRIC_TYPE_DRIFT,
    name="error_rate_delta",
    input_columns=[":table"],
    definition="{{current_df}}.weighted_error - {{base_df}}.weighted_error",
    output_data_type=T.StructField("output", T.DoubleType()).json(),
)