Mirar
Eu trabalho com a ferramenta complementar KingswaySoft SSIS "Premium Lookup", mas acho que a mesma pergunta pode surgir com a ferramenta integrada SSIS "Lookup".
Tento combinar um par de colunas duplas "first_name1" e "name1" e "first_name2" e "name2" e ambos os lados 1 e 2 às vezes têm valores NULL.
Se uma das colunas de pesquisa for NULL, toda a linha será passada para a saída "incomparável". A ferramenta Premium Lookup tem a seguinte aparência em um DFT: A entrada é passada para 32 linhas sem correspondência, pois um dos dois lados tem um valor NULL ou porque há um valor NULL em alguma outra coluna correspondente:
Meu objetivo é continuar combinando as colunas quando um NULL em uma delas for encontrado, para que a pesquisa continue e tente combinar as outras colunas também, enquanto a correspondência NULL deve ser:
- ou 0% de correspondência
- ou NULL e não é considerado a pontuação média.
Ambos seriam bons, pois tenho mais algumas colunas que geralmente combinam bem.
Peço um máximo de 5 correspondências e descarto qualquer correspondência da saída que tenha o mesmo ID da entrada primária, pois desejo encontrar apenas as entradas duplas. Portanto, devem ser mostrados até 5 "próximos vizinhos" para qualquer entrada que possa ter duplicatas nos dados mestre:
Por exemplo, se o primeiro nome não for conhecido em ambos os lados e até mesmo no campo de entrada primário, eu ainda gostaria de obter uma correspondência nas outras colunas, como "aniversário" ou "sexo".
O que eu tentei até agora
Já tentei substituir todos os valores NULL por uma string vazia para evitar NULL. No entanto, a pesquisa par difusa deve corresponder a pelo menos 1 por cento, e 1% não pode ser alcançado se você tentar comparar algo com uma string vazia, pois é 0%.
Lenda:
- Alemão/Inglês: Vorname = primeiro_nome, Nachname = nome, Geburtsdatum = aniversário, Geschlecht = sexo
- Pesquisa: lado 1: [1], lado 2: [2]
- Lado primário: [0] (desejo combinar as duas colunas de pesquisa com a mesma coluna primária duas vezes para copiar a coluna Nachname_Vergleich para uma segunda coluna Nachname_Vergleich2 e fazer o mesmo com a coluna Vorname)
A caixa de seleção "Tratar String Vazia como NULL" trava a Pesquisa Premium em qualquer entrada
Também tentei contornar isso definindo essas strings vazias ''
como NULL novamente pela própria ferramenta, mas essa configuração trava a pesquisa de qualquer entrada, seja NULL ou não, testada também durante algumas outras tarefas. Portanto, há um bug ou não entendo a configuração, mas pego essa caixa de seleção:
Configurações avançadas de comparação - v22.1 (22.1.0.30606) -> "Tratar string vazia como NULL"
Sempre que você o executa com uma caixa de seleção marcada, ele falha com três erros:
[Premium_Lookup_trying_to_match_NULLs [74]] Erro: Ocorreu um erro com a seguinte mensagem de erro: "System.NullReferenceException: referência de objeto não definida para uma instância de um objeto. (SSIS Productivity Pack, v22.1.0.30606 - DtsDebugHost, v13.0.4495. 10)".
[Premium_Lookup_trying_to_match_NULLs [74]] Erro: Premium_Lookup_trying_to_match_NULLs não conseguiu processar os dados.
[SSIS.Pipeline] Erro: Código de erro SSIS DTS_E_PROCESSINPUTFAILED. O método ProcessInput no componente "Premium_Lookup_trying_to_match_NULLs" (74) falhou com o código de erro 0xC02090F9 ao processar a entrada "Lookup Table Input" (79). O componente identificado retornou um erro do método ProcessInput. O erro é específico do componente, mas é fatal e fará com que a tarefa Data Flow pare de ser executada. Pode haver mensagens de erro postadas antes disso com mais informações sobre a falha.
E mesmo que funcionasse, não ajudaria, pois apenas substituiria as strings vazias por um NULL, o que provavelmente passaria as linhas para a saída sem correspondência novamente como era no início, para que nada fosse ganho com a substituição de NULL:s com strings vazias no início.
Gambiarra
Portanto, não obtenho nenhuma correspondência da ferramenta "Pesquisa Premium" enquanto a pesquisa funciona assim que defino a correspondência das duas colunas como "ignorar".
Minha solução alternativa é substituir o lado 1 pelo lado 2 se o lado 1 for NULL e, em seguida, ele for executado como deveria, mas isso também diminui uma chance de correspondência se ambos os lados estiverem preenchidos, e eu quero obter as duas pontuações correspondentes se as duas colunas estão preenchidas.
Portanto, a solução alternativa é apenas a segunda melhor maneira, já que desejo que a pesquisa simplesmente ignore NULL:s ou dê a eles 0 pontos de pontuação, já que a média dos pontos de pontuação ausentes é a média do conjunto de correspondências encontrado.
Pergunta
Para uma pesquisa que tem dois lados em relação a uma entrada primária que tem apenas um lado, quero combinar ambos os lados da pesquisa por conta própria com a entrada primária. Não quero apenas substituir o lado de pesquisa 1 pelo lado de pesquisa 2 se houver um NULL. Como posso fazer isso e ainda pular NULL:s ou dar a eles 0 pontos de pontuação em vez de perder as linhas para a saída incomparável, como parece acontecer aqui?
TLDR
A ferramenta Premium Lookup pode lidar com valores NULL.
Reconstrua todo o fluxo de dados excluindo tudo, inclusive a caixa Premium Lookup, mesmo que pareça saber o que você alterou nesse meio tempo. No novo fluxo de dados, tudo funcionou bem. Certifique-se de ter as strings que você tenta corresponder exatamente no mesmo formato (maiúsculas e minúsculas, espaços em branco e assim por diante, o que você pode fazer marcando a caixa de seleção na Pesquisa Premium ou no SQL).
A solução "rápida" é reconstruir tudo e cuidar dos formatos
Houve uma solução rápida para isso, aqui está o caminho de aprendizagem.
Eu me perguntei por que poderia obter pontuações correspondentes se correspondesse nas colunas "aniversário" ou "sexo", mas não em "primeiro nome" ou "nome. Foi desde o padrão de um novo par correspondente no "Editor de componente de pesquisa Premium" nem sempre é o mesmo. Se eu corresponder ao aniversário de
char(8)
, o padrão é 75% da velocidade e as duas primeiras caixas de seleção marcadas:Mas quando adicionei as colunas de nome, as "Configurações avançadas" padronizaram as duas segundas caixas de seleção marcadas e 0% de velocidade:
Quando fiz uma nova pesquisa do zero, o padrão era nada:
Eu tinha um padrão que não ignorava o caso, embora fosse necessário.
Acontece que eu havia alterado as colunas para minúsculas no SQL apenas no lado da pesquisa, mas não no lado da entrada primária, por isso as colunas de nome do lado 2 não puderam corresponder. E como pensei que a mudança de ambos os fluxos de dados para letras minúsculas já estava feita, não verifiquei e supervisionei mesmo ao ler letras maiúsculas com frequência, já que mantenho uma coluna com o formato inalterado também.
Pensando que já estava tudo em letras minúsculas, rolei apenas o "Limiar de Similaridade" para 1%:
Portanto, se você não alterou suas colunas de texto para algum padrão, marque as outras duas caixas na parte superior. Defino a velocidade para 75% da melhor velocidade, conforme escolhido no outro padrão, já que essa pesquisa difusa não trata das estatísticas de 100%.
Uma vez feito isso, isso levará a pontuações para todas as colunas:
E as estatísticas necessárias em geral, que são:
Assim, a ferramenta de pesquisa funciona como deveria, a pontuação média pode ser vista para todos mesmo que alguns valores sejam NULOS.
Mais uma vez, encontrei muitas linhas estranhas sem nenhuma pontuação ou com poucas pontuações e encontrei amostras nas quais eu sabia, por meio de uma pesquisa rápida, que devia haver uma correspondência, já que não havia nenhum valor NULL nelas. Marquei cada caixa em todo o fluxo de dados e, depois de reconstruir apenas algumas caixas, não houve nenhuma pontuação para uma configuração que tinha algumas pontuações antes da limpeza.
Eu decidi que:
Assim, 1.):
Certifiquei-me de que isso fosse feito para todas as seis colunas que precisavam (1x2 para a entrada primária e 2x2 para a pesquisa).
E 2.):
Você já ouviu falar dessa série de TV, algo como “SSIS Crowd” ou algo assim? Algo como: você já tentou construir de novo e de novo?
Resultado
Fluxo de dados
Assim, 160 para 32 linhas significa que para todos os dados, os 5 primeiros do "_richness_rank" são mostrados.
O que ainda não está no greenshot: você deve classificar a saída primeiro pelo seu "ID" e depois pelo "_richness_rank", pois a saída nem sempre é classificada, às vezes as classificações ficam fora do lugar.
E você pode querer eliminar qualquer correspondência que tenha exatamente o mesmo ID e, portanto, tenha as mesmas entradas, o que neste fluxo de dados eliminaria 10 linhas das 32 linhas de "ID":
Saída da tabela (colunas de estatísticas)
Vemos que às vezes o primeiro número é descartado, ou seja, apenas as 10 vezes que têm o mesmo ID de dados mestre na pesquisa. Eu também poderia eliminar essas linhas antes da pesquisa, mas acho bom saber se o ID está nos dados mestre ou não, o que fica claro apenas rolando. De qualquer forma, as 5 primeiras classificações são um número vago, e a primeira ou segunda classificação deve ser a única correspondência clara.