複雑なデータ型の変換
ネストされたデータ型を操作している間、Databricks は特定の変換をすぐに最適化します。 次のコード例は、Databricks で複雑なデータ型と入れ子になったデータ型を操作するパターンを示しています。
ネストされたデータにアクセスするためのドット表記
ドット表記 (.
) を使用して、ネストされたフィールドにアクセスできます。
- Python
- SQL
df.select("column_name.nested_field")
SELECT column_name.nested_field FROM table_name
ネストされたフィールドをすべて選択してください
スター演算子 (*
) を使用して、特定のフィールド内のすべてのフィールドを選択します。
これにより、指定した深さでネストされたフィールドのみがアンパックされます。
- Python
- SQL
df.select("column_name.*")
SELECT column_name.* FROM table_name
新しいネストされたフィールドの作成
struct()
関数を使用して、新しいネストされたフィールドを作成します。
- Python
- SQL
from pyspark.sql.functions import struct, col
df.select(struct(col("field_to_nest").alias("nested_field")).alias("column_name"))
SELECT struct(field_to_nest AS nested_field) AS column_name FROM table_name
すべてのフィールドを列にネストする
スター演算子 (*
) を使用して、データソースのすべてのフィールドを 1 つの列としてネストします。
- Python
- SQL
from pyspark.sql.functions import struct
df.select(struct("*").alias("column_name"))
SELECT struct(*) AS column_name FROM table_name
ネストされた列から名前付きフィールドを選択する
角括弧 []
を使用して、列からネストされたフィールドを選択します。
- Python
- SQL
from pyspark.sql.functions import col
df.select(col("column_name")["field_name"])
SELECT column_name["field_name"] FROM table_name
ネストされた要素をマップまたは配列から分解する
explode()
関数を使用して、ARRAY
型と MAP
型の列から値をアンパックします。
ARRAY
列は値をリストとして格納します。 explode()
で解凍すると、各値は出力の行になります。
- Python
- SQL
from pyspark.sql.functions import explode
df.select(explode("array_name").alias("column_name"))
SELECT explode(array_name) AS column_name FROM table_name
MAP
列は、順序付けられたキーと値のペアとして値を格納します。 explode()
で解凍すると、各キーは列になり、値は行になります。
- Python
- SQL
from pyspark.sql.functions import explode
df.select(explode("map_name").alias("column1_name", "column2_name"))
SELECT explode(map_name) AS (column1_name, column2_name) FROM table_name
リストまたはセットから配列を作成する
関数 collect_list()
または collect_set()
を使用して、列の値を配列に変換します。 collect_list()
は列内のすべての値を収集しますが、 collect_set()
は一意の値のみを収集します。
Spark は、どちらの操作から生じる配列内の項目の順序も保証しません。
- Python
- SQL
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"))
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
- SQL
df.select("column_name.field1")
SELECT column_name.field1 FROM table_name
ネストされたデータをJSONに変換する
to_json
関数を使用して、複合データ型を JSON に変換します。
- Python
- SQL
from pyspark.sql.functions import to_json
df.select(to_json("column_name").alias("json_name"))
SELECT to_json(column_name) AS json_name FROM table_name
クエリまたは DataFrame のすべてのコンテンツをエンコードするには、これを struct(*)
と組み合わせます。
- Python
- SQL
from pyspark.sql.functions import to_json, struct
df.select(to_json(struct("*")).alias("json_name"))
SELECT to_json(struct(*)) AS json_name FROM table_name
Databricks は、統合システムとの相互運用性のために複雑なデータ型を変換するための to_avro
と to_protobuf
もサポートしています。
JSON データを複雑なデータに変換する
from_json
関数を使用して、JSON データをネイティブの複合データ型に変換します。
JSON データのスキーマを指定する必要があります。
- Python
- SQL
from pyspark.sql.functions import from_json
schema = "column1 STRING, column2 DOUBLE"
df.select(from_json("json_name", schema).alias("column_name"))
SELECT from_json(json_name, "column1 STRING, column2 DOUBLE") AS column_name FROM table_name
ノートブック: 複雑なデータ型を変換する
次のノートブックは、Python、Scala、SQL の複雑なデータ型を操作する例を示しています。