0

我正在使用流分析查询来过滤我输入的复杂Json对象。将JSON包装到输出流分析查询中

输入:

{ 
    "id" : "001", 
    "firstArray":[ 
    { 
     "tid" : 9, 
     "secondArray":[ 
     { 
      "key1" : "value1", 
      "key2" : "value2" 
     }, 
     {...} 
     ] 
    }, 
    { 
     "tid" : 8, 
     "secondArray":[ 
     { 
      "key1" : "value1", 
      "key2" : "value2" 
     }, 
     {...} 
     ] 
    } 
    ] 
} 

这是我的查询:

WITH T1 AS 
    (
    SELECT 
     FirstArray.ArrayValue.Tid as Tid, 
     FirstArray.ArrayValue.secondArray as SecondArray 
    FROM 
     inputfromeventhub MySource 
    OUTER APPLY GetElements(MySource.firstArray) AS FirstArray 
    ) 
SELECT 
    T1.Tid as Tid, 
    SecondArray.ArrayValue.key1 as key1, 
    SecondArray.ArrayValue.key2 as key2 
INTO exitstream 
OUTER APPLY GetElements(T1.SecondArray) as SecondArray 

我得到的是这样的:

[ 
{ 
    "tid":9, 
    "key1": "value1", 
    "key2": "value2" 
}, 
{ 
    "tid":8, 
    "key1": "value1", 
    "key2": "value2" 
} 
] 

我想换这个JSON数组转换成一个JSON对象与一个独特的'身份证'来得到像这样的东西:

{ 
"id":"001", 
"array":[ 
    { 
    "tid":9, 
    "key1": "value1", 
    "key2": "value2" 
    }, 
    { 
    "tid":8, 
    "key1": "value1", 
    "key2": "value2" 
    } 
] 
} 

我找不到办法做到这一点。我试图创建一个第三选择调用一个用户定义的函数:

function main(obj) { 
    var out_obj = {}; 
    out_obj.id = "001"; 
    out_obj.array = obj; 

    return JSON.stringify(out_obj); 
} 

但这阵列中应用到每个对象..所以我得到这样的:

[ 
    { "myFunction": "{\"id\":\"001\",\"array{\"tid\":9,\"key1\":\"value1\",\"key2\":\"value2\"}" 
    }, 
    { "myFunction": "{\"id\":\"001\",\"array{\"tid\":8,\"key1\":\"value1\",\"key2\":\"value2\"}" 
    } 
] 

有没有办法来包装该数组中的所有嵌套对象都带有查询?

回答

0

根据您的要求,我测试了这个问题,你可以参考下面的代码片段:

JavaScript的UDF

function main(obj) { 
    var out_obj = []; 
    for(var i=0;i<obj.length;i++){ 
    var o=obj[i]; 
    for(var j=0;j<o.secondArray.length;j++){ 
     o1=o.secondArray[j]; 
     out_obj.push({tid:o.tid,key1:o1.key1,key2:o1.key2}); 
    } 
    } 
    return out_obj; 
} 

QUERY

SELECT 
    MySource.id, 
    udf.aggreate(MySource.firstArray) as array 
FROM 
    [inputfromeventhub] MySource 

输入

{ 
    "id" : "001", 
    "firstArray":[ 
    { 
     "tid" : 9, 
     "secondArray":[ 
     { 
      "key1" : "value01", 
      "key2" : "value02" 
     }, 
     { 
      "key1" : "value03", 
      "key2" : "value04" 
     } 
     ] 
    }, 
    { 
     "tid" : 8, 
     "secondArray":[ 
     { 
      "key1" : "value11", 
      "key2" : "value12" 
     }, 
     { 
      "key1" : "value13", 
      "key2" : "value14" 
     } 
     ] 
    } 
    ] 
} 

输出

enter image description here

+0

这正是我想要的, 非常感谢布鲁斯 – Sam