簡體   English   中英

Azure流分析:按名稱獲取數組元素

[英]Azure Stream Analytics: Get Array Elements by name

我想知道是否可以通過屬性名而不是位置名來獲取數組的元素。 例如,這是我的傳入數據:

    {
    "salesdata": {
        "productsbyzone": {
            "zones": [{
                    "eastzone": "shirts, trousers"
                },
                {
                    "westzone": "slacks"
                },
                {
                    "northzone": "gowns"
                },
                {
                    "southzone": "maxis"
                }
            ]
        }
    }
}

我打算將其移動到SQL數據庫,並且在數據庫中每個區域都有列。 問題在於,每個json中不同區域的順序都會變化。 我成功使用以下查詢,直到意識到每個json中區域的位置都發生了變化:

WITH 
salesData AS
(
    SELECT
    (c.salesdata.productsbyzone.zone,0) as eastzone,
    (c.salesdata.productsbyzone.zone,1) as westzone,
    (c.salesdata.productsbyzone.zone,2) as northzone,
    (c.salesdata.productsbyzone.zone,3) as sourthzone,
    FROM [sales-data] as c
)
SELECT
eastzone.eastzone as PRODUCTS_EAST,
westzone.westzone as PRODUCTS_WEST,
northzone.northzone as PRODUCTS_NORTH,
southzone.southzone as PRODUCTS_SOUTH
INTO PRODUCTSDATABASE
FROM salesData 

需要一種通過名稱而不是位置來引用這些字段的方法。

您可以使用GetArrayElement返回數組元素,然后訪問每個屬性。 請參考以下查詢

WITH 
salesData AS
(
    SELECT
        GetArrayElement(zones,0) as z
        FROM [sales-data] as s
)

SELECT
    z.eastzone
    z.westzone
    z.northzone
    z.southzone
FROM PRODUCTSDATABASE
FROM salesData

我建議一個解決方案:在azure流作業中使用JavaScript UDF完成列排序。

請參考我的樣本:

輸入數據(更改順序):

{
    "salesdata": {
        "productsbyzone": {
            "zones": [{
                    "westzone": "slacks"  
                },
                {
                    "eastzone": "shirts, trousers"
                },
                {
                    "northzone": "gowns"
                },
                {
                    "southzone": "maxis"
                }
            ]
        }
    }
}

js udf代碼:

function test(arg) {
    var z = arg;
    var obj = {
        eastzone: "",
        westzone: "",
        northzone: "",
        southzone: ""
    }   
    for(var i=0;i<z.length;i++){
        switch(Object.keys(z[i])[0]){
            case "eastzone": 
                obj.eastzone = z[i]["eastzone"];
                continue;
            case "westzone": 

                obj.westzone = z[i]["westzone"];
                continue;
            case "northzone": 

                obj.northzone = z[i]["northzone"];
                continue;
            case "southzone": 
                obj.southzone = z[i]["southzone"];
                continue;
        }
    }
    return obj;
}

您可以在obj參數中定義所需的順序

SQL:

WITH 
c AS
(
    SELECT 
    udf.test(jsoninput.salesdata.productsbyzone.zones) as result
    from jsoninput
),
b AS
(
  SELECT 
    c.result.eastzone as east,c.result.westzone as west,c.result.northzone as north,c.result.southzone as south
    from c
)

SELECT
    b.east,b.west,b.north,b.south
INTO
    jaycosmos
FROM
    b

輸出:

在此處輸入圖片說明

希望對您有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM