简体   繁体   中英

Azure Stream Analytics: Get Array Elements by name

I was wondering if it is possible for me to get the elements of the array by the name of property than the position. For example, this is my incoming data:

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

I intend to move this to a SQL database and I have columns within the database for each zone. The problem is that the order of different zones changes within each json. I was successfully using the following query until I realized that the position of the zones changes within each 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 

Need a way to reference these fields by the name rather than by the position.

You can use GetArrayElement to return array element then access to each property. Please refer the below query

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

I recommend a solution: Use the JavaScript UDF in the azure stream job to complete the columns sort.

Please refer to my sample:

Input data(upset the order):

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

js udf code:

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;
}

You can define the order you want in the obj parameter

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

Output:

在此处输入图片说明

Hope it helps you.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM