top of page

Databricks - Explodindo colunas STRING (Explode + From_json) usando SQL para acessar ARRAY e STRUCT

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.


177 visualizações0 comentário
Post: Blog2 Post
bottom of page