我正在尝试使用AWS Glue将DynamoDB表中的数据摄取到在S3上构建的Hive表中。
Source的数据如下所示-
{
"id": "123",
"name": "Peter",
"title": "My List",
"listItems": [
{
"manufacture_date": "2023-01-01",
"purchase_price": "20.0"
},
{
"manufacture_date": "2023-01-02",
"purchase_price": "30.0"
}
]
}
摄取数据代码:
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,
cast(listItems as string) as listItems
from ddb_src_df"""
glue_context.spark_session.sql(inst_sql)
我想在表中填充属性名称,以便以后可以从表中取消嵌套。但上面的代码返回的是没有属性名称的结果,如下所示-
| ID|名称|标题|列表项目|
| --|--|--|--|
| 123 |彼得|我的名单|[2023-01-01,20.0},{2023-01- 02,30.0}]|
我如何才能做到下面这样的事情呢?
预期输出:
| ID|名称|标题|列表项目|
| --|--|--|--|
| 123 |彼得|我的名单|【生产日期:2023-01- 01,purchase_price:20.0},{生产日期:2023-01- 02,purchase_price:30.0}】|
- 目标表结构:*
id string
name string
title string
listItems string
我想有结构列listItems作为字符串的属性有可能在未来添加更多的属性。请建议。
1条答案
按热度按时间fykwrbwg1#
你几乎已经完成了。在你的
insert
中,用to_json(listItems)
替换cast(listItems as string)
,你会得到“json-style”字符串。然后你可以使用regexp_replace
或其他东西删除属性名称和值周围的双引号,如果需要的话。