AWS Glue执行unnest/relationalize后无法选取嵌套字段如何解决?
错误原因
你执行扁平化操作后,输出结构里的json.rowId是完整的字段名,而非层级访问路径。Glue DynamicFrame的select_fields方法默认会将参数里的.识别为嵌套结构的层级分隔符,执行select_fields(["json.rowId"])时,它会尝试先查找顶层名为json的struct字段,再提取该struct下的rowId子字段,但扁平化后的DynamicFrame已经不存在json这个顶层struct字段,因此无法匹配到对应字段,返回空结果。
解决方法
- 方法1:转成Spark DataFrame操作,用反引号包裹带特殊字符的字段名
from awsglue.dynamicframe import DynamicFrame # 转DataFrame后查询 spark_df = dyF.toDF() result_df = spark_df.select("updatedAt", "`json.rowId`") # 若需要转回DynamicFrame result_dyF = DynamicFrame.fromDF(result_df, glueContext, "result_dyF") - 方法2:重命名字段消除特殊符号
用apply_mapping将带点的字段重命名为无点的格式,后续直接用新名称查询:dyF_renamed = dyF.apply_mapping([ ("updatedAt", "string", "updatedAt", "string"), ("`json.rowId`", "int", "json_row_id", "int") ]) # 直接查询重命名后的字段 result_dyF = dyF_renamed.select_fields(["updatedAt", "json_row_id"]) - 方法3:跳过主动扁平化步骤,直接从原始DynamicFrame提取嵌套字段
原始带struct结构的DynamicFrame本身就支持直接提取嵌套子字段,不需要先做扁平化:# original_dyF是你最初读取的未扁平化的DynamicFrame result_dyF = original_dyF.select_fields(["updatedAt", "json.rowId"]) # 提取后可以按需重命名字段 result_dyF = result_dyF.rename_field("json.rowId", "json_row_id")
内容的提问来源于stack exchange,提问作者user12166
相关产品推荐
相关产品推荐

