Trasformare tipi di dati complessi

Quando si lavora con tipi di dati annidati, Azure Databricks ottimizza automaticamente alcune trasformazioni di default. Gli esempi di codice seguenti illustrano i criteri per l'uso di tipi di dati complessi e annidati in Azure Databricks.

Notazione con punto per l'accesso ai dati annidati

Usare la notazione con punto (.) per accedere ai campi annidati.

Python

df.select("column_name.nested_field")

SQL

SELECT column_name.nested_field FROM table_name

Selezionare tutti i campi annidati

Usare l'operatore star (*) per selezionare tutti i campi all'interno di un determinato campo.

Nota

In questo modo vengono decompressi solo i campi annidati alla profondità specificata.

Python

df.select("column_name.*")

SQL

SELECT column_name.* FROM table_name

Creare un nuovo campo annidato

Usare la funzione struct() per creare un nuovo campo annidato.

Python

from pyspark.sql.functions import struct, col

df.select(struct(col("field_to_nest").alias("nested_field")).alias("column_name"))

SQL

SELECT struct(field_to_nest AS nested_field) AS column_name FROM table_name

Annidare tutti i campi in una colonna

Usare l'operatore asterisco (*) per annidare tutti i campi da un'origine dati in una singola colonna.

Python

from pyspark.sql.functions import struct

df.select(struct("*").alias("column_name"))

SQL

SELECT struct(*) AS column_name FROM table_name

Selezionare un campo specifico all'interno di una colonna nidificata

Usare le parentesi quadre [] per selezionare i campi annidati da una colonna.

Python

from pyspark.sql.functions import col

df.select(col("column_name")["field_name"])

SQL

SELECT column_name["field_name"] FROM table_name

Esplodere elementi annidati da una mappa o una matrice

Usare la funzione explode() per decomprimere i valori dalle colonne di tipo ARRAY e MAP .

Le colonne ARRAY archiviano i valori come elenco. Quando viene decompresso con explode(), ogni valore diventa una riga nell'output.

Python

from pyspark.sql.functions import explode

df.select(explode("array_name").alias("column_name"))

SQL

SELECT explode(array_name) AS column_name FROM table_name

Le colonne MAP archiviano i valori come coppie chiave-valore ordinate. Quando viene decompressa con explode(), ogni chiave diventa una colonna e i valori diventano righe.

Python

from pyspark.sql.functions import explode

df.select(explode("map_name").alias("column1_name", "column2_name"))

SQL

SELECT explode(map_name) AS (column1_name, column2_name) FROM table_name

Creare una matrice da un elenco o un set

Usare le funzioni collect_list() o collect_set() per trasformare i valori di una colonna in una matrice. collect_list() raccoglie tutti i valori nella colonna, mentre collect_set() raccoglie solo valori univoci.

Nota

Spark non garantisce l'ordine degli elementi nella matrice risultante da una delle due operazioni.

Python

from pyspark.sql.functions import collect_list, collect_set

df.select(collect_list("column_name").alias("array_name"))
df.select(collect_set("column_name").alias("set_name"))

SQL

SELECT collect_list(column_name) AS array_name FROM table_name;
SELECT collect_set(column_name) AS set_name FROM table_name;

Selezionare una colonna da una mappa in una matrice

È anche possibile usare la notazione con punto (.) per accedere ai campi nelle mappe contenute all'interno di una matrice. Viene restituita una matrice di tutti i valori per il campo specificato.

Si consideri la struttura di dati seguente:

{
  "column_name": [
    { "field1": 1, "field2": "a" },
    { "field1": 2, "field2": "b" }
  ]
}

È possibile restituire i valori da field1 come matrice con la query seguente:

Python

df.select("column_name.field1")

SQL

SELECT column_name.field1 FROM table_name

Trasformare i dati annidati in JSON

Usare la funzione to_json per convertire un tipo di dati complesso in JSON.

Python

from pyspark.sql.functions import to_json

df.select(to_json("column_name").alias("json_name"))

SQL

SELECT to_json(column_name) AS json_name FROM table_name

Per codificare tutto il contenuto di una query o di un dataframe, combinarlo con struct(*).

Python

from pyspark.sql.functions import to_json, struct

df.select(to_json(struct("*")).alias("json_name"))

SQL

SELECT to_json(struct(*)) AS json_name FROM table_name

Nota

Azure Databricks supporta anche to_avro e to_protobuf per trasformare tipi di dati complessi per l'interoperabilità con sistemi integrati.

Trasformare i dati JSON in dati complessi

Usare la funzione from_json per convertire i dati JSON in tipi di dati complessi nativi.

Nota

È necessario specificare lo schema per i dati JSON.

Python

from pyspark.sql.functions import from_json

schema = "column1 STRING, column2 DOUBLE"

df.select(from_json("json_name", schema).alias("column_name"))

SQL

SELECT from_json(json_name, "column1 STRING, column2 DOUBLE") AS column_name FROM table_name