Fala dataholics, no post de hoje mostraremos uma dica muito útil no dia a dia, explodiremos algumas coisas aqui hoje, mas serão apenas colunas em uma tabela no Databricks.
Trabalhar com colunas Array ou Struct não são tarefas simples para a maioria das pessoas, embora, se elas estiverem devidamente tipadas, temos várias funções que podem nos ajudar e acessar seus níveis sem muita complexidade, contudo, se os seus dados foram salvos como string, é adicionado uma complexidade a mais, acontece de armazenarem JSON como string, dificultando nossa vida, no post de hoje veremos como usar SQL a para brincar com esses tipos de dados.
O que veremos hoje:
Acessando API Groups do Databricks
Criando Dataframe manualmente
Acessando campos ARRAY e STRUCT
Usando EXPLODE com ARRAY
Acessando níveis numa STRING?
Usando FROM_JSON com schema manual
Usando FROM_JSON + EXPLODE
Retornar lista de todos os grupos e logins no nível de linha
Resumo de utilização de ARRAY, STRUCT e STRING
Geraremos alguns dados para aplicarmos as funções citadas, no ambiente de hoje acessaremos a API de groups do Databricks para listar todos os grupos e membros, estou apenas usando de exemplo.
Todo o código estará disponível no Github no final do post.
Abaixo serão os dados retornados pela nossa demo, porem, usando a API do Databricks para manipularmos os campos e estruturas.
No final temos retorno de um JSON.
No próximo comando estamos criando um Dataframe e gerando uma view temporária para brincarmos com esses dados usando SQL.
Note o schema retornado pelo Dataframe, temos a coluna Resources tipada como ARRAY e dentro desse array temos uma STRUCT, basicamente um array de struct.
Para simular o mesmo dataframe, só que agora ao invés de bem tipado, vamos criar tudo como String, então para isso, vou criá-lo manualmente.
No comando abaixo, estamos criando o segundo Dataframe e depois criando uma view temporária para acessar via SQL.
Exemplo do primeiro Dataframe, note que a coluna resources retorna de fato um Array, na própria Grid você tem a opção de expandir esse array.
Já o segundo dataframe pode notar que não temos a opção de expandir, pois, a coluna é do tipo String.
Para acessar um campo Array e Struct usando Python ou SQL, ambos fornecem várias funcionalidades para simplificar nossa vida, exemplo, para acessar um item especifico do ARRAY você pode passar a posição desejada, esse nosso ARRAY tem 7 posições, que seriam 1 para cada grupo no Databricks.
Após acessar o item do ARRAY dentro dele teremos uma STRUCT, para acessar essa estrutura podemos usar ponto (.).
Por fim, retornando todos os grupos e usuários ao nível de linha usando o EXPLODE.
Basicamente o EXPLODE transforma uma collection em linhas.
Acessar um ARRAY e STRUCT apesar de serem estruturas de dados complexas, temos muitas funcionalidades legais que facilitam a manipulação de dados, porém e se o seu JSON estiver armazenado em STRING?
Vamos para o segundo Dataframe, fazendo um teste básico note que não temos a possibilidade de acessar usando a mesma função anterior.
Para resolver esse caso precisaremos primeiramente transformar nossa STRING em um JSON, temos uma função que faz isso de forma relativamente simples FROM_JSON().
Essa função recebe uma string e um schema de entrada e retorna um JSON.
Note que você não precisa declarar o schema completo, apenas dos campos que você deseja acessar dentro do JSON, no meu exemplo declarei uma STRUCT, pois, nosso ARRAY é uma lista de STRUCT.
Agora, vamos declarar o schema completo e note que agora temos o mesmo formato do primeiro Dataframe.
Veja que chegamos no mesmo resultado, deu um pouco mais de trabalho, sim, mas é possível, essas funções podem salvar sua vida no dia a dia, daqui para frente é imaginação.
Resumo:
Se os seus campos já estiverem corretamente tipados é simples:
Array: Informar a posição que quer acessar, exemplo pegando o primeiro item [0], usar o EXPLODE para transformar em linhas
STRUCT: Acessar usando ponto (.), exemplo group.displayName.
STRING: Primeiro transformar em JSON usando FROM_JSON, depois seguir os mesmos exemplos acima dependendo do retorno e necessidade.
E aí curtiu essa dica?
Github:
Fique bem e até a próxima.