概要
PySparkにてArrayType内のカラムにドット(.)が含まれるカラムにSELECTする方法を共有します。カラム名をそのまま指定すると下記のようなエラーメッセージが表示されます。
AnalysisException: No such struct field strintg in strintg.in.array
対応方法としては、ドットが含まれるカラムをバッククォート(`)で囲むことでSELECTができるようになります。シングルクォーテーション(')ではないことに注意してください。
下記のようなスキーマの場合には、array.`strintg.in.array` と記載することで、データを取得することができます。カラムごとにバッククォートで囲む必要があるため、`array.strintg.in.array` のようにカラム全体を囲むだけではエラーが発生します。
root
|-- array: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- strintg.in.array: string (nullable = true)
手順
1. データの準備
json_data ="""
{
"array":[
{ "strintg.in.array": "値①"},
{ "strintg.in.array": "値②"},
{ "strintg.in.array": "値③"}
]
}
"""
df = spark.read.json(sc.parallelize([json_data]))
df.createOrReplaceTempView('tmp_nested_columns')
# df.display()
df.printSchema()
2. DataframeでSELECTする方法
df_2 = df.select('array.`strintg.in.array`')
# df_2.display()
3. SQLでSELECTする方法
%sql
SELECT
array.`strintg.in.array`
FROM
tmp_nested_columns