Transformação Flatten

Descompacta dados da matriz em linhas separadas para cada valor. Esta transformação opera em uma única coluna.

Ele não faz referência às chaves na matriz. Se os dados de sua matriz contiverem chaves, use a transformação unnest. Consulte Transformação Unnest.

Uso básico

flatten col: myArray

Saída: gera uma linha separada para cada valor na matriz. Os valores de outras colunas nas linhas geradas são copiados da origem.

Parâmetros

flatten: col: column_ref

ParâmetroObrigatório?Transform BuilderTipo de dadosDescrição
colSColunastringNome da coluna de origem

Para mais informações sobre os padrões de sintaxe, consulte Notas de sintaxe da documentação da linguagem.

col

Identifica a coluna na qual aplicar a transformação. Você pode especificar apenas uma coluna.

Observações sobre o uso:

Obrigatório?Tipo de dados
SimString (nome da coluna)

Exemplos

Exemplo - Nivelar uma matriz

Neste exemplo, os dados de origem incluem uma série de pontuações que precisam ser divididas em linhas separadas.

Fonte:

LastNameFirstNameScores
AdamsAllen[81,87,83,79]
BurnsBonnie[98,94,92,85]
CannonChris[88,81,85,78]

Transformação:

Quando os dados são importados, talvez seja necessário digitar novamente a coluna Scores como uma matriz:

settype col: Scores type: 'Array'

Agora você pode nivelar os dados da coluna Scores em linhas separadas:

flatten col: Scores

Resultados:

LastNameFirstNameScores
AdamsAllen81
AdamsAllen87
AdamsAllen83
AdamsAllen79
BurnsBonnie98
BurnsBonnie94
BurnsBonnie92
BurnsBonnie85
CannonChris88
CannonChris81
CannonChris85
CannonChris78

Este exemplo é apresentado abaixo.

Exemplo - Flatten e unnest juntos

O exemplo acima nivela os dados, mas há dois problemas potenciais com os resultados:

  • Não há identificador para cada teste. Por exemplo, a pontuação de 87 de Allen Adams não pode ser associada ao teste específico no qual ele registrou a pontuação.
  • Não existe um identificador exclusivo para cada linha.

O exemplo a seguir aborda os dois problemas. Ele também demonstra diferenças entre as transformações unnest e flatten, incluindo a forma como o unnest é usado para nivelar os dados da matriz com base em chaves especificadas.

Fonte:

Você tem os seguintes dados sobre as pontuações dos testes dos alunos. As pontuações individuais são armazenadas na matriz Scores, e você precisa acompanhar cada teste em uma linha exclusivamente identificável. Este exemplo tem dois objetivos:

  1. Uma linha para cada teste de estudante.
  2. Um identificador exclusivo para cada combinação estudante-pontuação.
LastNameFirstNameScores
AdamsAllen[81,87,83,79]
BurnsBonnie[98,94,92,85]
CannonCharles[88,81,85,78]

Transformação:

Quando os dados são importados no formato CSV, você precisa adicionar uma transformação header e remover as aspas da coluna Scores:

header

replace col:Scores with:'' on:`"` global:true

Validar a data do teste: para começar, verifique a quantidade adequada de pontuações de teste para cada estudante. Utilize a seguinte transformação para calcular a diferença entre o número esperado de elementos na matriz Scores (4) e o número real:

derive value: (4 - ARRAYLEN(Scores)) as: 'numMissingTests'

Quando a transformação for visualizada, será possível ver, no conjunto de dados da amostra, que foram incluídos todos os testes. Você decide se quer ou não incluir essa coluna no conjunto de dados final, já que poderá identificar testes ausentes quando a receita for executada em escala.

Identificador exclusivo de linha: é preciso dividir a matriz Scores em linhas individuais para cada teste. No entanto, não há identificador exclusivo para que cada uma delas execute o rastreamento de testes. Em teoria, você poderia usar a combinação dos valores LastName-FirstName-Scores para fazê-lo, mas, se um aluno gravou o mesmo resultado duas vezes, o conjunto de dados fica com linhas duplicadas. Na transformação a seguir, você cria uma matriz paralela chamada Tests, que contém uma matriz de índice para o número de valores na coluna Scores. Os valores do índice começam em 0:

derive value:RANGE(0,ARRAYLEN(Scores)) as:'Tests'

Além disso, criaremos um identificador para a linha de origem usando a função SOURCEROWNUMBER:

derive value:SOURCEROWNUMBER() as:'orderIndex'

Uma linha para cada teste de estudante: seus dados precisam ter a seguinte aparência:

LastNameFirstNameScoresTestsorderIndex
AdamsAllen[81,87,83,79][0,1,2,3]2
BurnsBonnie[98,94,92,85][0,1,2,3]3
CannonCharles[88,81,85,78][0,1,2,3]4

Agora, reúna as matrizes Tests e Scores em uma única matriz aninhada usando a função ARRAYZIP:

derive value:ARRAYZIP([Tests,Scores])

O conjunto de dados foi alterado:

LastNameFirstNameScoresTestsorderIndexcolumn1
AdamsAllen[81,87,83,79][0,1,2,3]2[[0,81],[1,87],[2,83],[3,79]]
AdamsBonnie[98,94,92,85][0,1,2,3]3[[0,98],[1,94],[2,92],[3,85]]
CannonCharles[88,81,85,78][0,1,2,3]4[[0,88],[1,81],[2,85],[3,78]]

Com a transformação flatten, é possível descompactar a matriz aninhada:

flatten col: column1

Cada combinação teste-pontuação agora é dividida em uma linha separada. É preciso que as combinações aninhadas Test-Score sejam divididas em colunas separadas usando unnest:

unnest col:column1 keys:'[0]','[1]'

Depois de descartar a column1, que não é mais necessária, renomeie as duas colunas geradas:

rename col:column_0 to:'TestNum'

rename col:column_0 to:'TestScore'

Identificador exclusivo de linha: execute mais uma etapa para criar identificadores exclusivos de teste que identificam o teste específico para cada estudante. Veja a seguir como o identificador de linha original OrderIndex é usado como um identificador para o estudante, e o valor TestNumber para criar o valor da coluna TestId:

derive value: (orderIndex * 10) + TestNum as: 'TestId'

Os valores acima são números inteiros. Para tornar seus identificadores mais atraentes, adicione isto:

merge col:'TestId00','TestId'


Extensão:
convém gerar algumas informações estatísticas resumidas nesse conjunto de dados. Por exemplo, você pode estar interessado em calcular o resultado médio do teste de cada estudante. Nesta etapa, é necessário descobrir como agrupar adequadamente os valores de teste. Nesse caso, não é possível agrupar pelo valor LastName e, quando executado em escala, poderá haver colisões entre os nomes quando essa receita for executada nesse modo. Portanto, talvez seja necessário criar um tipo de chave primária usando o seguinte código:

merge col:'LastName','FirstName' with:'-' as:'studentId'

Agora, use isto como um parâmetro de agrupamento para o cálculo:

derive value:AVERAGE(TestScore) group:studentId as:'avg_TestScore'

Resultados:

Depois de descartar as colunas desnecessárias e mover as outras, o conjunto de dados será semelhante ao seguinte:

TestIdLastNameFirstNameTestNumTestScorestudentIdavg_TestScore
TestId0021AdamsAllen081Adams-Allen82,5
TestId0022AdamsAllen187Adams-Allen82,5
TestId0023AdamsAllen283Adams-Allen82,5
TestId0024AdamsAllen379Adams-Allen82,5
TestId0031AdamsBonnie098Adams-Bonnie92,25
TestId0032AdamsBonnie194Adams-Bonnie92,25
TestId0033AdamsBonnie292Adams-Bonnie92,25
TestId0034AdamsBonnie385Adams-Bonnie92,25
TestId0041CannonChris088Cannon-Chris83
TestId0042CannonChris181Cannon-Chris83
TestId0043CannonChris285Cannon-Chris83
TestId0044CannonChris378Cannon-Chris83

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Google Cloud Dataprep
Precisa de ajuda? Acesse nossa página de suporte.