pasar flujo con matriz a varias filas en SQL por Stream Analytics
Avatar eid
Pregunta contestada

pasar flujo con matriz a varias filas en SQL por Stream Analytics

Tengo una transmisión de IoT Hub como:

{
    "topic": "saveData",
    "deviceId": "testDevice",
    "data": [
        {
            "timestamp": "2018-04-06T11:46:11.842305",
            "device": "baiTest",
            "variable": "Status01_Test",
            "name": "m_01_test",
            "value": 365
        },
        {
            "timestamp": "2018-04-06T11:46:11.842306",
            "device": "hmuTest",
            "variable": "Status02_Test",
            "name": "m_02_test",
            "value": 817
        },
        {
            "timestamp": "2018-04-06T11:46:11.842307",
            "device": "vwzTest",
            "variable": "Status03_Test",
            "name": "m_03_test",
            "value": 247
        }
    ]
}

Quiero pasar este flujo en una base de datos SQL como esta:

deviceId    timestamp                   device   variable       name       value
testDevice  2018-04-06T11:46:11.842305  baiTest  Status01_Test  m_01_test  365
testDevice  2018-04-06T11:46:11.842306  hmuTest  Status02_Test  m_02_test  817
testDevice  2018-04-06T11:46:11.842307  vwzTest  Status03_Test  m_03_test  247

Mi código hasta ahora es:

WITH itemList AS ( 
    SELECT deviceId, GetArrayElement(data,0) as datas
    FROM [iotHub] WHERE topic = 'saveData' )
SELECT deviceId, datas.timestamp, datas.device, datas.variable, datas.name, datas.value
INTO [sqlTable]
FROM itemList

Pero esto solo almacena el primer índice [0] de data.array en SQL. Creo que el almacenamiento de la matriz podría manejarse con la función **GetArrayElements** pero no pude administrarlo.

Mostrar la mejor respuesta

Debe usar GetArrayElements para aplanar json complejo en Azure Stream Analytics. Consulte la siguiente consulta.

SELECT   
  iothubAlias.deviceId,
  arrayElement.ArrayValue.timestamp,
  arrayElement.ArrayValue.device,
  arrayElement.ArrayValue.variable,
  arrayElement.ArrayValue.name,
  arrayElement.ArrayValue.value
FROM [iothub-input] as iothubAlias  
CROSS APPLY GetArrayElements(iothubAlias.data) AS arrayElement  

Obtendrás el resultado que deseas. ingrese la descripción de la imagen aquí