0

要求:我需要一个胶水作业来将 aws-dynamodb(地图和列表的嵌套结构组合)数据放入 s3。

我的方法:首先,我使用胶水动态框架将 dynamodb 中的所有数据放入一个动态框架中。

datasource = glueContext.create_dynamic_frame.from_options(
             "dynamodb",
              connection_options={
                 "dynamodb.input.tableName": table_name,
                 "dynamodb.throughput.read.percent": read_percentage,
                 "dynamodb.splits": "100",
    }
)

使用它后,我得到了datasource包含所有数据的动态框架。

在这里我想做一些转换并想要执行一些过滤器,所以这就是我使用 pyspark 数据框概念的原因。

df0 = datasource.toDF()

我的输入数据框df0包含 struct 格式的 json 数据collection,所以我曾经to_json将 struct 转换为 json-string。在这里我需要 json 字符串而不是结构。

df1 = df0.select(to_json("collection"))

df1,我正在访问我想要的任何东西。

主要问题

集合中存在的一些属性看起来像这样

collection : { 
              "name" : "aaa",
               "id" : "111" ,
               "address" : "some address",
               "price" : 
                        {"string" : 1212.0 },
               "retailer" :
                         {"string" : "xxxx"},
               "categories" : "array": [
                                       "7216"
                                       ]
}

如果您看到上面的示例pricereatiler, categories, 数据类型将显示为嵌套属性。

我想要这样的输出

collection : { 
              "name" : "aaa",
               "id" : "111" ,
               "address" : "some address",
               "price" : "1212.0",
               "retailer" :"xxxx",
               "categories" : "[7216]"
}

我该如何解决这个问题,请告诉我

4

1 回答 1

2

您面临的问题是预期行为,因为 Glue 让您可以选择为 DynamicFrame 中具有不明确类型的列选择所需的数据类型。

ResolveChoice提供了用于解决具有多个选项的 DynamicFrame 中的歧义类型的信息。

根据您的要求,您可以选择任何此选项并解决问题。

于 2020-08-28T15:47:52.683 回答