Um projeto de web de hobby meu usa dados de muitas fontes, algumas planas, outras altamente normalizadas. Meu processo ETL resume todas as fontes em uma tabela lógica (que em breve incluirá alguns campos com vários valores). A tabela final é carregada em alguns ambientes de apresentação de dados separados (com base em Solr ou MySQL). Meu ambiente Solr exige um modelo desnormalizado (ele apenas carrega a tabela de saída transformada diretamente como um arquivo simples) e meus ambientes MySQL podem usar um modelo altamente normalizado (o carregamento envolve alguma normalização). Ambos os processos de carregamento do ambiente de apresentação são muito simples agora.
Para facilitar o uso de arquivos simples em todo o meu processo ETL (importante porque uso uma variedade de ferramentas para resumir e limpar os dados e fazer uso intenso de pipelines por motivos de desempenho), consegui reduzir campos com vários valores de minhas fontes para um único campo usando agrupamento ou seleção de melhor candidato.
Agora estou projetando os campos de vários valores que preciso preservar em minha saída. O processo de carregamento do MySQL é fácil porque já o normalizei com esses campos em mente. Mas estou tendo problemas com a parte do Solr:
- Não tenho experiência com campos "multiValued" no Solr
- o processo de carregamento de arquivo simples é atualmente muito simples, gostaria de preservar o máximo de simplicidade possível
- meus campos multiValor devem ser coordenados por posição dentro de um registro, por exemplo
- registro X, campo A, posição 3 é uma licença #
- registro X, campo B, posição 3 é o estado correspondente para aquela licença
Como posso projetar meu ETL para os campos de vários valores que pretendo preservar?
Algumas ideias que tive e que estou encontrando obstáculos:
- introduzir um registro "aditivo" usando a mesma chave de documento que ocupa sua própria linha no arquivo simples
- não faço ideia por onde começar neste
- pré-montar valores em um único campo, analisar usando Solr, por exemplo
- {[[123],[456]];[[MA],[CA]]} -> "123,MA;456,CA"
- não tenho certeza se o Solr pode descompactar uma string e preservar as informações de posição apropriadamente nos campos
Não consegui encontrar informações sobre como coordenar valores de campo multiValor de campos separados. Permitindo o fato de que isso pode não ser suportado nativamente pelo Solr, ainda estou interessado em soluções para carregar campos multiValued no Solr de uma maneira quase tão simples quanto carregar um arquivo simples.
Obtendo dados multiValor no Solr via CSV:
A documentação do solr descreve uma função "split" em UpdateCSV. Essencialmente, ele analisa um valor de campo usando um segundo analisador CSV. Consulte Solr-UpdateCSV-split . Os parâmetros se parecem com isso (ajuste o nome do campo, separador e encapsulador conforme necessário):
Obtendo dados multiValor de campos separados para manter a posição:
Desde que fiz essa pergunta, fiz algumas leituras sobre modelos dimensionais. Parece que o que eu estava tentando fazer é um design ruim, porque coloca muitas expectativas no aplicativo, muita complexidade no warehouse ou ambos.
Ao tentar preservar as relações entre dois valores de campo em um único registro, é melhor armazená-los separadamente e também juntos. Aqui está uma comparação da minha entrada anterior com a nova entrada:
Antiga entrada CSV:
Entrada CSV transformada:
Dessa forma, seu aplicativo pode usar os valores de dimensão licenseState e licenseType independentemente, ou pode usar os valores de dimensão licenseStateType, tudo sem exigir aplicativos complicados ou lógica de depósito.