Suporte à ordenação para Delta Lake

No Databricks Runtime 16.4 LTS e versões posteriores, especifique regras de agrupamento em campos de string de tabelas do Delta Lake para controlar comparações de strings e o comportamento de ordenação no nível da coluna, como habilitar correspondência sem distinção entre maiúsculas e minúsculas ou ordenação sensível à localidade.

Para obter uma explicação completa dos tipos de ordenação, convenções de nomenclatura e regras de precedência, consulte Ordenação.

Por padrão, Delta Lake define a ordenação de campos de cadeia de caracteres como UTF8_BINARY.

Important

Habilitar a ordenação adiciona o recurso de gravação de tabela collations à sua tabela do Delta Lake, o que afeta a compatibilidade com leitores externos e outros recursos da plataforma. Examine a seção Limitações antes de habilitar a ordenação em tabelas de produção.

Criar uma tabela com ordenação

Você pode especificar a ordenação no nível da coluna ao criar uma nova tabela. A ordenação pode ser aplicada a colunas de cadeia de caracteres de nível superior e campos de cadeia de caracteres dentro de tipos aninhados:

CREATE TABLE catalog.schema.my_table (
  id BIGINT,
  name STRING COLLATE UTF8_LCASE,
  metadata STRUCT<label: STRING COLLATE UNICODE>,
  tags ARRAY<STRING COLLATE UTF8_LCASE>,
  properties MAP<STRING, STRING COLLATE UTF8_LCASE>
) USING delta

Note

As chaves MAP não podem usar ordenação. Somente os valores MAP oferecem suporte a cadeias de caracteres organizadas.

Alterar ordenação em uma coluna existente

Você pode alterar a ordenação de uma coluna existente usando ALTER TABLE.

Por exemplo, para definir uma coluna com ordenação que não diferencia maiúsculas de minúsculas:

ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_LCASE

Por exemplo, para reverter uma coluna para a ordenação binária padrão:

--
ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY

Atualizar estatísticas e layout de dados depois de alterar a ordenação

Alterar a ordenação de uma coluna não reescreve dados existentes nem atualiza estatísticas. As consultas retornam resultados corretos sob a nova ordenação imediatamente, mas ignorar arquivos e o clustering pode ser menos eficaz até que você execute as seguintes etapas:

  1. Atualize as estatísticas de ignorar arquivos para a coluna:
   ANALYZE TABLE my_table COMPUTE DELTA STATISTICS
  1. Se a tabela usar clustering do Liquid, reescreva o layout de clustering:
   OPTIMIZE FULL my_table
  1. Se a tabela usar o ZORDER, desative a otimização incremental e reescreva todos os arquivos:
   SET spark.databricks.optimize.incremental = false;
   OPTIMIZE my_table ZORDER BY zorder_column;

Ignorar essas etapas não causa resultados incorretos, mas pode reduzir o desempenho da consulta em dados históricos até a próxima reescrita completa.

A ordenação é sempre respeitada pelo Azure Databricks nos resultados da consulta.

Desativar a ordenação de uma tabela

Para remover o recurso de tabela de ordenação, defina cada coluna agrupada de volta como UTF8_BINARY.

Primeiro, execute este comando para cada coluna agrupada:

ALTER TABLE my_table ALTER COLUMN name TYPE STRING COLLATE UTF8_BINARY

Em seguida, remova o recurso da tabela:

ALTER TABLE my_table DROP FEATURE collations

Consulte Remover um recurso da tabela do Delta Lake e fazer downgrade do protocolo da tabela para obter mais detalhes.

Evolução e ordenação de esquema

Quando a evolução do esquema adiciona ou mescla colunas que têm a ordenação especificada, as seguintes regras se aplicam:

  • Se uma coluna de origem já existir na tabela de destino, a ordenação da tabela de destino para essa coluna será preservada. A ordenação da coluna de origem é ignorada.
  • Se uma coluna de origem for nova e tiver uma ordenação especificada, a tabela de destino adotará essa ordenação para a nova coluna.
  • Se a tabela de destino ainda não tiver o recurso de collations tabela habilitado, adicionar uma coluna agrupada a habilitará automaticamente.

Limitações

As limitações a seguir se aplicam às tabelas do Delta Lake com agrupamento habilitado:

Compatibilidade e interoperabilidade:

  • Os leitores externos que não reconhecem o recurso de tabela collations recorrem ao UTF8_BINARY, o que pode produzir ordens de classificação ou comparações incorretas.
  • O OpenSharing não dá suporte ao compartilhamento de partições individuais em colunas de ordenação não padrão. Em vez disso, compartilhe a tabela.
  • UniForm não é compatível com tabelas com ordenação.
  • Tabelas delta lake criadas externamente com uma ordenação não reconhecida pelo Databricks Runtime geram uma exceção quando consultadas.
  • As APIs delta lake do OSS para Scala ou Python não dão suporte à ordenação. Use APIs de SQL ou DataFrame do Spark.

Restrições de consulta e recurso:

  • Colunas ordenadas não podem ser usadas em restrições CHECK
  • Colunas agrupadas não podem ser referenciadas em expressões de coluna geradas
  • Colunas ordenadas não podem ser usadas com índices de filtro de bloom (preteridos)
  • Colunas ordenadas não podem ser referenciadas em consultas com estado de Streaming Estruturado (agregações, junções, eliminação de duplicação)
  • Uma MAP chave não pode ser uma cadeia de caracteres agrupada. Somente valores MAP dão suporte à ordenação

Recursos adicionais