通过AWS Glue将DynamoDB数据导入S3 Hive表时数组结构体丢失属性名
解决方案:保留DynamoDB嵌套数组的属性名转为字符串存储
问题出在直接使用cast(listItems as string)转换嵌套数组时,Spark会将结构体转为无属性名的字符串格式(类似{value1, value2})。要保留完整的键值对结构,应该使用Spark的to_json()函数,它会将嵌套的数组/结构体序列化为标准JSON字符串,完整保留属性名。
修改后的代码
调整SQL中的字段转换逻辑,替换原有的cast为to_json:
datasource = glue_context.create_dynamic_frame.from_options( connection_type="dynamodb", connection_options={"dynamodb.input.tableName": "purchase_list"}, transformation_ctx="datasource") ddb_src_df = datasource.toDF() ddb_src_df.createOrReplaceTempView("ddb_src_df") inst_sql = f"""insert overwrite table purchase_list select id, name, title, to_json(listItems) as listItems from ddb_src_df""" glue_context.spark_session.sql(inst_sql)
执行效果
转换后的listItems字段会生成标准JSON格式的字符串,完整保留属性名:
[{"manufacture_date":"2023-01-01","purchase_price":"20.0"},{"manufacture_date":"2023-01-02","purchase_price":"30.0"}]
(注:标准JSON用双引号包裹键和字符串值,比预期格式更规范,后续展开数据时兼容性更强)
方案优势
- 自动保留所有嵌套属性名,未来新增属性无需修改代码
- 生成的标准JSON字符串便于后续通过
from_json()或其他JSON解析工具展开数据 - 完全符合目标表的
string类型字段要求
内容的提问来源于stack exchange,提问作者vvazza
相关产品推荐
相关产品推荐

