Manipular dados duplicados no Azure Data Explorer

Os dispositivos que enviam dados para a nuvem mantêm um cache local dos dados. Dependendo do tamanho dos dados, o cache local pode armazenar dados por dias ou até meses. Você deseja proteger seus bancos de dados analíticos contra dispositivos com mau funcionamento que reenviam os dados armazenados em cache e causam duplicação de dados no banco de dados analítico. As duplicatas podem afetar o número de registros retornados por uma consulta. Esse problema é relevante quando você precisa de uma contagem precisa de registros, como ao contar eventos. Este artigo descreve as práticas recomendadas para lidar com dados duplicados para esses tipos de cenários.

A melhor solução para a duplicação de dados é evitar a duplicação. Se possível, corrija o problema numa fase anterior do pipeline de dados. Essa abordagem economiza custos associados à movimentação de dados ao longo do pipeline de dados e evita gastar recursos para lidar com dados duplicados ingeridos no sistema. No entanto, em situações em que você não pode modificar o sistema de origem, você pode usar vários métodos para resolver esse cenário.

Compreender o impacto dos dados duplicados

Monitore a porcentagem de dados duplicados. Depois de descobrir a porcentagem de dados duplicados, você pode analisar o escopo do problema e o impacto nos negócios e escolher a solução apropriada.

Exemplo de consulta para identificar a porcentagem de registros duplicados:

let _sample = 0.01; // 1% sampling
let _data =
DeviceEventsAll
| where EventDateTime between (datetime('10-01-2018 10:00') .. datetime('10-10-2018 10:00'));
let _totalRecords = toscalar(_data | count);
_data
| where rand()<= _sample
| summarize recordsCount=count() by hash(DeviceId) + hash(EventId) + hash(StationId)  // Use all dimensions that make row unique. Combining hashes can be improved
| summarize duplicateRecords=countif(recordsCount  > 1)
| extend duplicate_percentage = (duplicateRecords / _sample) / _totalRecords  

Soluções para lidar com dados duplicados

Solução 1: Não remova dados duplicados

Compreenda os requisitos de negócios e a tolerância a dados duplicados. Alguns conjuntos de dados podem ser gerenciados com uma determinada porcentagem de dados duplicados. Se os dados duplicados não tiverem um grande impacto, você poderá ignorar sua presença. A vantagem de não remover os dados duplicados é que ele não adiciona nenhuma sobrecarga extra no processo de ingestão ou no desempenho da consulta.

Solução 2: Manipular linhas duplicadas durante a consulta

Outra opção é filtrar as linhas duplicadas nos dados durante a consulta. Você pode usar a arg_max() função de agregação para filtrar os registros duplicados e retornar o último registro com base no carimbo de data/hora (ou outra coluna). A vantagem de usar este método é a ingestão de dados mais rápida, uma vez que a desduplicação ocorre no momento da consulta. Além disso, todos os registros (incluindo duplicatas) estão disponíveis para auditoria e solução de problemas. A desvantagem de usar a arg_max função é o tempo de consulta extra e carga na CPU cada vez que os dados são consultados. Dependendo da quantidade de dados que estão sendo consultados, essa solução pode se tornar não funcional ou consumir memória e exigir a mudança para outras opções.

No exemplo a seguir, consultamos o último registro ingerido para um conjunto de colunas que determinam os registros exclusivos:

DeviceEventsAll
| where EventDateTime > ago(90d)
| summarize hint.strategy=shuffle arg_max(EventDateTime, *) by DeviceId, EventId, StationId

Você também pode colocar essa consulta dentro de uma função em vez de consultar diretamente a tabela:

.create function DeviceEventsView
{
    DeviceEventsAll
    | where EventDateTime > ago(90d)
    | summarize arg_max(EventDateTime, *) by DeviceId, EventId, StationId
}

Solução 3: Utilizar vistas materializadas para eliminar a duplicação

Você pode usar visões materializadas para desduplicação através das funções de agregação take_any()/arg_min()/arg_max() (veja o exemplo #4 no comando criar visão materializada).

Observação

As exibições materializadas consomem recursos de cluster, que podem não ser desprezíveis. Para obter mais informações, consulte Considerações de desempenho sobre visões materializadas.

Solução 4: Use a exclusão suave para remover duplicatas

A exclusão suave suporta a capacidade de excluir registros individuais, para que você possa usá-la para excluir duplicatas. Use essa opção apenas para exclusões pouco frequentes, não se você precisar constantemente desduplicar todos os registros recebidos.

Escolha entre visualizações materializadas e exclusão suave para eliminação de duplicação de dados

Considere os seguintes fatores ao escolher entre exibições materializadas e exclusão suave para desduplicação:

  • Gestão e orquestração: As visualizações materializadas são uma solução totalmente gerida. Você define uma vista uma vez, e o sistema se encarrega da deduplicação para todos os registos recebidos. A exclusão suave requer orquestração e gerenciamento. Se as visualizações materializadas funcionarem para o seu caso de uso, escolha esta opção.
  • Quando os registros são deduplicados: com a eliminação lógica, você primeiro adiciona registros duplicados a uma tabela e, em seguida, os exclui. Assim, entre os processos de ingestão e soft delete, a tabela contém duplicatas. Com vistas materializadas, os registos na vista são sempre desduplicados, pois o sistema os desduplica antes de entrarem na vista.
  • Frequência: Se precisar de desduplicar constantemente uma tabela, utilize vistas materializadas. Se as duplicatas são pouco frequentes e você pode identificá-las durante a ingestão, o processo de exclusão suave geralmente funciona melhor do que as visualizações materializadas. Por exemplo, se suas ingestões normalmente não têm duplicatas, mas ocasionalmente incluem um fluxo conhecido por conter duplicatas, é melhor lidar com essas duplicatas com exclusão suave em vez de definir uma exibição materializada que tenta constantemente desduplicar todos os registros.

Solução 5: ingest-by tags de extensão

Você pode usar tags de extensão 'ingest-by:' para evitar duplicatas durante a ingestão. Esta solução só é relevante nos casos de utilização em que cada lote de ingestão não tem duplicados, e os duplicados só ocorrem se o mesmo lote de ingestão for ingerido mais do que uma vez.

Resumo

Você pode lidar com a duplicação de dados de várias maneiras. Avalie as opções cuidadosamente, tendo em conta o preço e o desempenho, para determinar o melhor método para o seu negócio.