Operação ETL - Retornar a chave primária
-
22-09-2019 - |
Pergunta
Estou usando o Talend para preencher um data warehouse. Meu trabalho está escrevendo dados do cliente em uma tabela de dimensões e dados de transação para a tabela de fatos. A chave substituta (p_key) na tabela de fatos é a incrementação automática. Quando insiro um novo cliente, preciso da minha tabela de fatos para refletir o ID do cliente relacionado.
Como mencionei, meu P_KEY é auto_incrementing automaticamente, não posso apenas inserir um valor arbitrário para o P_KEY.
Algum pensamento sobre como posso inserir uma linha na minha tabela de dimensões e ainda recuperar a chave primária para referência no meu registro de fatos?
Mais informações:
E se os dados recebidos não forem normalizados? Por exemplo, tenho um CSV com os seguintes dados:
order # date total customer# first_name last_name
111 1/2/2010 500 101 John Smith
222 1/3/2010 600 101 John Smith
Obviamente, quero que as informações do cliente apareçam na tabela de dimensões e nos dados da transação na tabela de fatos:
dimension
101 john smith
fact
111 1/3/2010
222 1/3/2010
Como você mencionou, a chave da tabela de dimensões será incremento automático. A tabela de fatos precisa fazer referência a essa chave. Como você cria o trabalho ETL para que a chave substituta seja devolvida após uma inserção?
Além disso, se os dados do cliente forem deduzidos (como acima), como você lida com as teclas?
Solução
No entanto, posso ter entendido seu problema:
Uma tabela de fatos pode ou não ter um PK de incrementação automática, geralmente uma tabela de PK em uma fato é um composto de várias tabelas de dimensão de referência do FKS.
Uma tabela de dimensão deve ter um PK de incrementação automática.
Um novo cliente deve "ter pousar" na tabela de dimensões do cliente antes que o fato da transação atinja o DW (ou pelo menos a tabela de fatos).
Uma tabela de dimensões deve ter um BusinessKey que identifique exclusivamente um cliente - como email, nome completo + pino ou similar.
Uma linha de transação recebida também deve ter o campo BusinessKey do cliente - é assim que identificamos o cliente.
Use o BusinessKey para procurar o cliente primário da tabela de dimensões do cliente antes de inserir a transação na tabela de fatos.
EDITAR
Se os dados do seu novo cliente estiverem agrupados com a transação, encontre uma maneira de extrair dados do cliente e direcioná -los para o DW antes da transação.
ATUALIZAR:
Carregue o Dimcustomer primeiro, decida sobre o BusinessKey - para que a dimensão seria:
CustomerKey = 12345 (auto-incremented)
CustomerBusinessKey = john_smith_101 (must uniquely identify the John Smith)
CustomerFirstName = John
CustomerLastName = Smith
Durante o processo de carregamento da dimensão, você deve segregar linhas de entrada em dois fluxos, clientes existentes e novos. As linhas da atualização do fluxo de "cliente existente" da tabela Dim (SCD tipo 1), enquanto as linhas do fluxo "novo cliente" são inseridas. Não deve haver duplicatas no fluxo de linhas que estão sendo inseridas; Você pode conseguir isso inserindo -os em uma tabela de preparação e removendo duplicatas lá, pouco antes da inserção final na tabela de dimensões. Você também pode extrair duplicatas e direcioná -las de volta ao processo de carregamento para atualizar os registros do cliente; Eles podem conter dados mais recentes - como números de telefone atualizados ou similares.
Quando o cliente estiver, carregue fatos.
A tabela de fato deve parecer algo como:
DateKey (PK)
CustomerKey
OrderNumber (PK)
Total
Eu usei a chave primária composta do DateKey e do OrderNumber, permitindo que a sequência do número do pedido seja redefinida de tempos em tempos.
Durante o processo de carregamento, modifique o registro de fatos para parecer algo como:
DateKey CustomerBusinessKey OrderNumber Total
20100201 john_smith_101 111 500
20100301 john_smith_101 222 600
Nesse ponto, precisamos substituir o cliente -pressionismo pelo cliente da tabela de dimensões usando uma pesquisa. Então, depois da pesquisa, a corrente seria:
DateKey CustomerKey OrderNumber Total
20100201 12345 111 500
20100301 12345 222 600
Agora isso pode ser inserido na tabela de fatos.
Eu também trapacei um pouco - não procurei uma chave de data do Dimdate e não procurei linhas existentes na tabela de fato. Ao carregar a tabela de fatos, você pode procurar uma combinação existente (DateKey, Ordernumer) antes de carregar, ou pode deixá -la para a chave primária para proteger novamente duplicações - sua escolha. De qualquer forma, certifique-se de que uma tentativa de recarregar os mesmos dados na tabela de fatos falhe.