Manipular dados duplicados no Azure Data Explorer
Os dispositivos que enviam dados para a nuvem mantêm um cache local dos dados. Dependendo do volume dos dados, o cache local pode armazenar dados por dias, e até meses. Você deseja proteger os seus bancos de dados analíticos contra o funcionamento incorreto de dispositivos que reenviam os dados armazenados em cache e causam a duplicação dos dados no banco de dados analítico. Duplicatas podem afetar o número de registros retornados por uma consulta. Isso é relevante quando você precisa de uma contagem precisa de registros, como a contagem de eventos. Este tópico descreve as melhores práticas para tratar de dados duplicados nesses tipos de cenário.
A melhor solução para a duplicação de dados é impedi-la. Se possível, corrija o problema antecipadamente no pipeline de dados, o que economiza os custos associados à movimentação de dados ao longo do pipeline de dados e evita o gasto de recursos copiando dados duplicados ingeridos pelo sistema. No entanto, em situações em que o sistema de origem não pode ser modificado, há várias maneiras de lidar com esse cenário.
Entender o impacto dos dados duplicados
Monitore a porcentagem dos dados duplicados. Após descobrir a porcentagem de dados duplicados, você pode analisar o escopo do problema e o impacto nos negócios e escolher a solução adequada.
Amostra 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 remover os dados duplicados
Entenda os requisitos de negócios e a tolerância dos dados duplicados. Alguns conjunto de dados podem ser gerenciados com uma determinada porcentagem de dados duplicados. Se os dados duplicados não têm impacto significativo, você pode ignorá-los. A vantagem de não remover os dados duplicados é não ter sobrecarga adicional no processo de ingestão nem no desempenho da consulta.
Solução 2: lidar com linhas duplicadas durante a consulta
Outra opção é filtrar as linhas duplicadas nos dados durante a consulta. A função de agregação arg_max()
pode ser usada para filtrar os registros duplicados e retornar o último registro com base no carimbo de data/hora (ou outra coluna). A vantagem de usar esse método é a ingestão mais rápida, uma vez que a eliminação de duplicação ocorre durante o tempo de 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 função arg_max
é o tempo de consulta adicional e a carga na CPU todas as vezes que os dados são consultados. Dependendo da quantidade de dados que está sendo consultada, essa solução pode se tornar não funcional ou consumir muita memória, o que exige a alternação para outras opções.
No seguinte exemplo, consultamos o último registro ingerido para um conjunto de colunas que determina os registros exclusivos:
DeviceEventsAll
| where EventDateTime > ago(90d)
| summarize hint.strategy=shuffle arg_max(EventDateTime, *) by DeviceId, EventId, StationId
Essa consulta também pode ser colocada dentro de uma função em vez de ser feita diretamente na tabela:
.create function DeviceEventsView
{
DeviceEventsAll
| where EventDateTime > ago(90d)
| summarize arg_max(EventDateTime, *) by DeviceId, EventId, StationId
}
Solução 3: usar exibições materializadas para eliminar duplicações
As exibições materializadas podem ser usadas para a eliminação de duplicação usando as funções de agregação take_any()/arg_min()/arg_max() (confira o exemplo 4 em comando de criação de exibição materializada).
Observação
As exibições materializadas têm o custo de consumo de recursos do cluster, que pode não ser insignificante. Para obter mais informações, confira as considerações sobre o desempenho das exibições materializadas.
Solução nº 4: usar a exclusão temporária para remover duplicatas
A exclusão temporária dá suporte à capacidade de excluir registros individuais e, portanto, pode ser usada para excluir duplicatas. Essa opção é recomendada somente para exclusões pouco frequentes, não se você precisa eliminar a duplicação de todos os registros de entrada o tempo todo.
Escolher entre as exibições materializadas e a exclusão temporária para eliminação de duplicação de dados
Há várias considerações que ajudam a escolher as exibições materializadas ou a exclusão temporária para eliminação de duplicação:
- Gerenciamento e orquestração: as exibições materializadas são uma solução totalmente gerenciada. Uma exibição é definida uma vez e o sistema processa a eliminação de duplicação de todos os registros de entrada. A exclusão temporária exige orquestração e gerenciamento. Portanto, se as exibições materializadas funcionam no seu caso de uso, escolha essa opção.
- Quando a duplicação é eliminada dos registros: com a exclusão temporária, os registros duplicados são primeiro adicionados a uma tabela e depois excluídos. Portanto, entre os processos de ingestão e exclusão temporária, a tabela contém duplicatas. Com as exibições materializadas, os registros na exibição sempre estão sem duplicatas, pois a eliminação de duplicação ocorre antes que eles entrem na exibição.
- Frequência: se uma tabela precisa contar com a eliminação de duplicação constante, use as exibições materializadas. Quando você prevê que as duplicatas serão pouco frequentes e consegue identificá-las durante a ingestão, o processo de exclusão temporária geralmente tem um desempenho melhor do que as exibições materializadas. Por exemplo, uma situação em que as ingestões normalmente não têm duplicatas, mas ocasionalmente um fluxo que contém duplicatas é ingerido. Nesse cenário, é melhor processar essas duplicatas com a exclusão temporária do que definir uma exibição materializada que sempre tenta eliminar a duplicação de todos registros.
Solução nº 5: marcas de extensão de ingest-by
As marcas de extensão 'ingest-by:' podem ser usadas para evitar duplicatas durante a ingestão. Essa opção é relevante somente em casos de uso com a certeza de que cada lote de ingestão não tem duplicatas e só poderá haver duplicatas se o mesmo lote de ingestão for ingerido mais de uma vez.
Resumo
A duplicação de dados pode ser tratada de várias maneiras. Avalie as opções atentamente, levando em conta o preço e o desempenho para determinar o método correto para os seus negócios.