Eliminação de duplicação de dados em Query Service
O Adobe Experience Platform Query Service oferece suporte à eliminação de duplicação de dados. A desduplicação de dados pode ser feita quando é necessário remover uma linha inteira de um cálculo ou ignorar um conjunto específico de campos, pois apenas parte dos dados na linha é informação duplicada.
A desduplicação geralmente envolve o uso da função ROW_NUMBER()
em uma janela para uma ID (ou um par de IDs) ao longo do tempo solicitado, que retorna um novo campo que representa o número de vezes que uma duplicata foi detectada. O horário geralmente é representado usando o campo timestamp
do Experience Data Model (XDM).
Quando o valor de ROW_NUMBER()
é 1
, ele se refere à instância original. Geralmente, essa é a instância que você desejaria usar. Na maioria das vezes, isso será feito dentro de uma subseleção em que a desduplicação é feita em um SELECT
de nível superior, como executar uma contagem agregada.
Os casos de uso de desduplicação podem ser globais ou restritos a um único usuário ou ID de usuário final no identityMap
.
Este documento descreve como executar a desduplicação em três casos de uso comuns: Eventos de experiência, compras e métricas.
Cada exemplo inclui o escopo, a chave da janela, um outline do método de desduplicação, bem como a consulta SQL completa.
Eventos de experiência experience-events
No caso de Eventos de experiência duplicados, você provavelmente desejará ignorar toda a linha.
Escopo: Global
Chave da janela: id
Exemplo de desduplicação
SELECT *,
ROW_NUMBER()
OVER (PARTITION BY id
ORDER BY timestamp ASC
) AS id_dup_num
FROM experience_events
Exemplo completo
SELECT COUNT(*) AS num_events FROM (
SELECT *,
ROW_NUMBER()
OVER (PARTITION BY id
ORDER BY timestamp ASC
) AS id_dup_num
FROM experience_events
) WHERE id_dup_num = 1
Compras purchases
Se você tiver compras duplicadas, provavelmente desejará manter a maior parte da linha Experience Event, mas ignorar os campos vinculados à compra (como a métrica commerce.orders
). As compras contêm um campo especial para a ID de compra, que é commerce.order.purchaseID
.
É recomendável usar purchaseID
no escopo do visitante, pois é o campo semântico padrão para IDs de compra no XDM. O escopo do visitante é recomendado para remover dados de compra duplicados, pois a consulta é mais rápida do que o uso do escopo global e é improvável que uma ID de compra seja duplicada em várias IDs de visitante.
Escopo: Visitante
Chave da janela: identityMap[$NAMESPACE].id & commerce.order.purchaseID
Exemplo de desduplicação
SELECT *,
IF(LENGTH(commerce.`order`.purchaseID) > 0,
ROW_NUMBER()
OVER (PARTITION BY identityMap['ECID'].id, commerce.`order`.purchaseID
ORDER BY timestamp ASC
),
1) AS purchaseID_dup_num
FROM experience_events
Exemplo completo
O exemplo abaixo usa uma cláusula de condição para usar a ID de evento no caso de a ID de compra não estar presente.
SELECT SUM(commerce.purchases.value) AS num_purchases FROM (
SELECT *,
ROW_NUMBER()
OVER (PARTITION BY id
ORDER BY timestamp ASC
) AS id_dup_num,
IF(LENGTH(commerce.`order`.purchaseID) > 0,
ROW_NUMBER()
OVER (PARTITION BY identityMap['ECID'].id, commerce.order.purchaseID
ORDER BY timestamp ASC
),
1) AS purchaseID_dup_num
FROM experience_events
) WHERE id_dup_num = 1 AND purchaseID_dup_num = 1
Métricas metrics
Se você tiver uma métrica que esteja usando a ID exclusiva opcional e uma duplicata dessa ID for exibida, você provavelmente desejará ignorar esse valor de métrica e manter o restante do Evento de experiência.
No XDM, quase todas as métricas usam o tipo de dados Measure
que inclui um campo id
opcional que pode ser usado para desduplicação.
Escopo: Visitante
Chave da janela: identityMap[$NAMESPACE].id e id do objeto Measure
Exemplo de desduplicação
SELECT *,
IF(LENGTH(application.launches.id) > 0,
ROW_NUMBER()
OVER (PARTITION BY identityMap['ECID'].id, application.launches.id
ORDER BY timestamp ASC
),
1) AS launchesID_dup_num
FROM experience_events
Exemplo completo
SELECT SUM(application.launches.value) AS num_launches FROM (
SELECT *,
ROW_NUMBER()
OVER (PARTITION BY id
ORDER BY timestamp ASC
) AS id_dup_num,
IF(LENGTH(application.launches.id) > 0,
ROW_NUMBER()
OVER (PARTITION BY identityMap['ECID'].id, application.launches.id
ORDER BY timestamp ASC
),
1) AS launchesID_dup_num
FROM experience_events
) WHERE id_dup_num = 1 AND launchesID_dup_num = 1
Próximas etapas
Este documento forneceu exemplos de desduplicação de dados e descreveu como executar a desduplicação de dados no Serviço de consulta. Para obter mais práticas recomendadas ao gravar consultas usando o Serviço de consulta, leia o guia de gravação de consultas.