Как извлечь и сгладить массив JSON, а также указать значение массива для TIMESTAMP BY в Stream Analytics Query - PullRequest
0 голосов
/ 03 июня 2019

Я получил следующие данные входного потока в Stream Analytics.

[
    {
        "timestamp": 1559529369274,
        "values": [
            {
                "id": "SimCh01.Device01.Ramp1",
                "v": 39,
                "q": 1,
                "t": 1559529359833
            },
            {
                "id": "SimCh01.Device01.Ramp2",
                "v": 183.5,
                "q": 1,
                "t": 1559529359833
            }
        ],
        "EventProcessedUtcTime": "2019-06-03T02:37:29.5824231Z",
        "PartitionId": 3,
        "EventEnqueuedUtcTime": "2019-06-03T02:37:29.4390000Z",
        "IoTHub": {
            "MessageId": null,
            "CorrelationId": null,
            "ConnectionDeviceId": "ew-IoT-01-KepServer",
            "ConnectionDeviceGenerationId": "636948080712635859",
            "EnqueuedTime": "2019-06-03T02:37:29.4260000Z",
            "StreamId": null
        }
    }
]

Я пытаюсь извлечь массив «values» и указать «t» в элементе массива для TIMESTAMP BY

Мне удалось выполнить запрос с помощью простого оператора SAQL в Stream Analytics, чтобы прочитать входные данные и направить их к выходным данным.Тем не менее, я заинтересован только в массиве "values" выше.

Это моя первая попытка.Мне не нравится мой оператор «TIMESTAMP BY», когда я пытаюсь перезапустить Stream Analytics Job

SELECT
    KepValues.ArrayValue.id,
    KepValues.ArrayValue.v,
    KepValues.ArrayValue.q,
    KepValues.ArrayValue.t
INTO
    [PowerBI-DS]
FROM
   [IoTHub-Input] as event
    CROSS APPLY GetArrayElements(event.[values]) as KepValues
    TIMESTAMP BY KepValues.ArrayValue.t 

============================================================================= Это моя вторая попытка.Мне все еще не нравится мой оператор «TIMESTAMP BY».

With [PowerBI-Modified-DS] As (
    SELECT
        KepValues.ArrayValue.id as ID,
        KepValues.ArrayValue.v as V,
        KepValues.ArrayValue.q as Q,
        KepValues.ArrayValue.t as T
    FROM
       [IoTHub-Input] as event
       CROSS APPLY GetArrayElements(event.[values]) as KepValues
)
SELECT
    ID, V, Q, T
INTO
    [PowerBI-DS]
FROM 
    [PowerBI-Modified-DS] TIMESTAMP BY T 

После извлечения, это то, что я ожидал: таблица со столбцами «id», «v», «q», «t» икаждая строка будет иметь один ArrayElement.например,

"SimCh01.Device01.Ramp1", 39, 1, 1559529359833
"SimCh01.Device01.Ramp2", 183.5, 1, 1559529359833

Добавлено

С тех пор я изменил запрос, как показано ниже, для создания DateTime путем преобразования времени Unix t в время DateTime

With [PowerBI-Modified-DS] As (
SELECT
        arrayElement.ArrayValue.id as ID,
        arrayElement.ArrayValue.v as V,
        arrayElement.ArrayValue.q as Q,
        arrayElement.ArrayValue.t as TT
FROM
       [IoTHub-Input] as iothubAlias
       CROSS APPLY GetArrayElements(iothubAlias.data) as arrayElement 
)      
SELECT
    ID, V, Q, DATEADD(millisecond, TT, '1970-01-01T00:00:00Z')  as T
INTO
    [SAJ-01-PowerBI]
FROM 
    [PowerBI-Modified-DS] 

Мне удается добавить DATEADD () для преобразования Unix Time в DateTime и назвать его как T. Теперь, как я могу добавить TIMESTAMP BY.Я попытался добавить за [PowerBI-Modified-DS].Но редактор жалуется, что вставка недействительна.Что еще я могу сделать.Или это лучшее, что я могу сделать.Я понимаю, что мне нужно установить TIMESTAMP BY, чтобы Power BI понимала, что это потоковые данные.

1 Ответ

0 голосов
/ 04 июня 2019

Предложение TIMESTAMP BY в Stream Analytics требует, чтобы значение было типа DATETIME.Поддерживаются строковые значения, соответствующие форматам ISO 8601.В вашем примере значение 't' не соответствует этому стандарту.

Чтобы использовать предложение TIMESTAMP BY в вашем случае, вам придется предварительно обработать данные перед отправкой в ​​Stream Analytics или изменитьисточник для создания события (в частности, поле 't') с использованием этого формата.

Stream Analytics назначает TIMESTAMP до выполнения запроса.Таким образом, выражение TIMESTAMP BY может ссылаться только на поля во входных данных.У вас есть 2 варианта.

  1. У вас может быть 2 задания ASA.Сначала выполняется CROSS APPLY, а во втором - TIMESTAMP BY.
  2. Вы можете внедрить десериализатор в C # ( зарегистрироваться для предварительного просмотра ).Таким образом, вы можете иметь одно задание, которое использует вашу реализацию для чтения входящих событий.Ваш десериализатор преобразует время Unix в DateTime, и это поле затем можно использовать в предложении TIMESTAMP BY.
...