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