メインコンテンツまでスキップ

複雑なデータ型の変換

ネストされたデータ型を操作している間、Databricks は特定の変換をすぐに最適化します。 次のコード例は、Databricks で複雑なデータ型と入れ子になったデータ型を操作するパターンを示しています。

ネストされたデータにアクセスするためのドット表記

ドット表記 (.) を使用して、ネストされたフィールドにアクセスできます。

Python
df.select("column_name.nested_field")

ネストされたフィールドをすべて選択してください

スター演算子 (*) を使用して、特定のフィールド内のすべてのフィールドを選択します。

注記

これにより、指定した深さでネストされたフィールドのみがアンパックされます。

Python
df.select("column_name.*")

新しいネストされたフィールドの作成

struct() 関数を使用して、新しいネストされたフィールドを作成します。

Python
from pyspark.sql.functions import struct, col

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

すべてのフィールドを列にネストする

スター演算子 (*) を使用して、データソースのすべてのフィールドを 1 つの列としてネストします。

Python
from pyspark.sql.functions import struct

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

ネストされた列から名前付きフィールドを選択する

角括弧 [] を使用して、列からネストされたフィールドを選択します。

Python
from pyspark.sql.functions import col

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

ネストされた要素をマップまたは配列から分解する

explode() 関数を使用して、ARRAY 型と MAP 型の列から値をアンパックします。

ARRAY 列は値をリストとして格納します。 explode()で解凍すると、各値は出力の行になります。

Python
from pyspark.sql.functions import explode

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

MAP 列は、順序付けられたキーと値のペアとして値を格納します。 explode()で解凍すると、各キーは列になり、値は行になります。

Python
from pyspark.sql.functions import explode

df.select(explode("map_name").alias("column1_name", "column2_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"))

配列内のマップから列を選択する

ドット表記 (.) を使用して、配列内に含まれるマップ内のフィールドにアクセスすることもできます。 これは、指定されたフィールドのすべての値の配列を返します。

次のデータ構造について考えてみます。

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

field1 からの値を配列として返すには、次のクエリを使用します。

Python
df.select("column_name.field1")

ネストされたデータをJSONに変換する

to_json 関数を使用して、複合データ型を JSON に変換します。

Python
from pyspark.sql.functions import to_json

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

クエリまたは DataFrame のすべてのコンテンツをエンコードするには、これを struct(*)と組み合わせます。

Python
from pyspark.sql.functions import to_json, struct

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

Databricks は、統合システムとの相互運用性のために複雑なデータ型を変換するための to_avroto_protobuf もサポートしています。

JSON データを複雑なデータに変換する

from_json 関数を使用して、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"))

ノートブック: 複雑なデータ型を変換する

次のノートブックは、Python、Scala、SQL の複雑なデータ型を操作する例を示しています。

複雑なデータ型の変換 Python ノートブック

Open notebook in new tab

複雑なデータ型の変換 Scala ノートブック

Open notebook in new tab

複合データ型の変換 SQL ノートブック

Open notebook in new tab