Apache Spark 在将数据从DynamDB导入S3中的Hive表期间,在Array Struct字段中获取属性名称时出现问题

jfgube3f  于 2023-10-23  发布在  Apache
关注(0)|答案(1)|浏览(108)

我正在尝试使用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作为字符串的属性有可能在未来添加更多的属性。请建议。

fykwrbwg

fykwrbwg1#

你几乎已经完成了。在你的insert中,用to_json(listItems)替换cast(listItems as string),你会得到“json-style”字符串。然后你可以使用regexp_replace或其他东西删除属性名称和值周围的双引号,如果需要的话。

相关问题