Поделиться через


Преобразование сложных типов данных

При работе с вложенными типами данных Azure Databricks оптимизирует определенные преобразования в стандартном виде. В следующих примерах кода показаны шаблоны для работы с сложными и вложенными типами данных в Azure Databricks.

Нотация точек для доступа к вложенным данным

Для доступа к вложенного поля можно использовать нотацию точек (.).

Python

df.select("column_name.nested_field")

SQL

SELECT column_name.nested_field FROM table_name

Выберите все вложенные поля

Используйте оператор star (*) для выбора всех полей в заданном поле.

Примечание.

Это только распаковка вложенных полей на указанной глубине.

Python

df.select("column_name.*")

SQL

SELECT column_name.* FROM table_name

Создание вложенного поля

Используйте функцию struct() для создания нового вложенного поля.

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

Вложение всех полей в столбец

Используйте оператор звездочки (*) для вложения всех полей из источника данных в виде одного столбца.

Python

from pyspark.sql.functions import struct

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

SQL

SELECT struct(*) AS column_name FROM table_name

Выберите именованное поле из вложенного столбца

Используйте квадратные скобки для выбора вложенных [] полей из столбца.

Python

from pyspark.sql.functions import col

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

SQL

SELECT column_name["field_name"] FROM table_name

Взрыв вложенных элементов из карты или массива

Используйте функцию для распаковки значений explode() из ARRAY столбцов и MAP типов.

ARRAY столбцы хранят значения в виде списка. При распаковке explode()с каждым значением становится строка в выходных данных.

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

MAP столбцы хранят значения в виде упорядоченных пар "ключ-значение". При распаковке с explode()каждым ключом становится столбец и значения становятся строками.

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

Создание массива из списка или набора

Используйте функции collect_list() или collect_set() преобразуйте значения столбца в массив. collect_list() собирает все значения в столбце, а collect_set() собирает только уникальные значения.

Примечание.

Spark не гарантирует порядок элементов в массиве в результате любой операции.

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;

Выбор столбца из карты в массиве

Вы также можете использовать нотацию точек (.) для доступа к полям в картах, содержащихся в массиве. Возвращает массив всех значений для указанного поля.

Рассмотрим следующую структуру данных:

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

Значения из массива можно вернуть с field1 помощью следующего запроса:

Python

df.select("column_name.field1")

SQL

SELECT column_name.field1 FROM table_name

Преобразование вложенных данных в JSON

Используйте функцию to_json для преобразования сложного типа данных в 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

Чтобы закодировать все содержимое запроса или кадра данных, объедините его с 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

Примечание.

Azure Databricks также поддерживает to_avro и to_protobuf преобразует сложные типы данных для взаимодействия с интегрированными системами.

Преобразование данных JSON в сложные данные

Используйте функцию для преобразования данных JSON в собственные сложные from_json типы данных.

Примечание.

Необходимо указать схему для данных 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

Записная книжка: преобразование сложных типов данных

В следующих записных книжках приведены примеры работы с сложными типами данных для Python, Scala и SQL.

Записная книжка преобразования сложных типов данных Python

Получить записную книжку

Записная книжка преобразования сложных типов данных Scala

Получить записную книжку

Записная книжка преобразования сложных типов данных SQL

Получить записную книжку