複合データ型を変換する

Azure Databricks は入れ子になったデータ型を操作しながら、一部の変換を追加設定なしで最適化できます。 次のコード例は、Azure Databricks で複合データ型や入れ子になったデータ型を操作するためのパターンを示しています。

入れ子になったデータにアクセスするためのドット表記

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

Python

df.select("column_name.nested_field")

SQL

SELECT column_name.nested_field FROM table_name

入れ子になったすべてのフィールドを選択する

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

Note

これは、指定された深さの入れ子になったフィールドのみを展開します。

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

すべてのフィールドを 1 つの列に入れ子にする

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

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() で展開すると、各値は出力内で 1 つの行になります。

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() で展開すると、各キーが 1 つの列になり、値が行になります。

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() は一意の値のみを収集します。

Note

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

クエリまたは DataFrame のすべてのコンテンツをエンコードするには、これを 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

Note

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

JSON データを複合データに変換する

from_json 関数を使用して、JSON データをネイティブの複合データ型に変換します。

Note

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 ノートブックの変換

ノートブックを入手