1

我需要帮助。我有类似的数据

[{
"id": "0001",
"type": "donut",
"name": "Cake",
"topping":
    [
        { "id": "5003", "type": "Chocolate" },
        { "id": "5004", "type": "Maple" }
    ]
}]

我想将其转换为以下

在此处输入图像描述

参数将是动态的或多个,而不仅仅是 Chocolate 和 Maple )

我想创建一个流分析查询来处理这些数据并将其存储到 Destination 表中,该表已经具有 Id、Name、Type、Chocolate、Maple 等列......请帮助我。

4

2 回答 2

1

您可以从ASA 中的udf获得帮助。

UDF 代码:

function main(arg) {
    var array = arg.topping;
    var map = {};
    map["id"] = arg.id;
    map["type"] = arg.type;
    map["name"] = arg.name;
    for(var i=0;i<array.length;i++){        
        var key=array[i].type;        
        map[key] = array[i].id;      
    }
    return map;  
}

SQL:

WITH 
c AS
(
    SELECT 
    udf.processArray(jsoninput) as result
    from jsoninput
)

select c.result
INTO
    jaycosmos
from c

样本数据:

[{
"id": "0001",
"type": "donut",
"name": "Cake",
"topping":
    [
        { "id": "5003", "type": "Chocolate" },
        { "id": "5004", "type": "Maple" }
    ]
},
{
"id": "0002",
"type": "donut2",
"name": "Cake2",
"topping":
    [
        { "id": "5005", "type": "Chocolate" }
    ]
}
]

输出:

在此处输入图像描述

于 2018-10-31T06:19:20.513 回答
0

基于 Jay 的回答,您可以使用以下 udf 代码更高效地执行相同的操作:

function main(arg) {
    return arg.map(x => (
        x.topping.reduce((acc, cur) => {
            acc[cur.type] = cur.id; // dynamically add items from topping array
            return acc;
        }, { id: x.id, type: x.type, name: x.name }) // initialise with static items
    )); 
}

不幸的是,在撰写本文时,CosmosDb 不支持 ECMAScript2018,因此您不能...在对象上使用扩展运算符,否则您可以使用以下单行:

function main(arg) {
    return arg.map(x => (
        x.topping.reduce(
            (acc, cur) => ({ ...acc, [cur.type]: cur.id }), 
            { id: x.id, type: x.type, name: x.name }
        )
));
}
于 2021-04-14T07:01:27.523 回答