Аналитический запрос Azure Stream не возвращает набор результатов при использовании метки времени

Я пытаюсь извлечь количество произведенных деталей в минуту, где v — агрегированный счетчик деталей, произведенных до этого времени.

Мой лазурный SQL-запрос выглядит следующим образом:

select 
x.fqn,
( max(cast(y.arrayvalue.v as BIGINT))-(min(cast(y.arrayvalue.v as BIGINT)))) as ppm
 from
(SELECT
   TS.ArrayIndex,
   TS.ArrayValue.FQN,
   TS.ArrayValue.vqts
FROM
[EventHubInput] as hub    
timestamp by y.arrayvalue.t
CROSS APPLY GetArrayElements(hub.timeseries) AS TS) as x
cross apply GetArrayElements(x.vqts) AS y
where x.fqn like '%Production%' and y.arrayvalue.q=192
group by tumblingwindow(minute,1),x.fqn

Мои входные данные выглядят так

{
 "timeSeries": [
{
    "fqn":"MyEnterprise.Gateways.GatewayE.CLX.Tags.StateBasic",
        "vqts":[
                {
                "v": "" ,
                "q": 192 ,
                "t":"2016-06-24T16:39:45.683+0000"
                }
    ]
},              {
    "fqn":"MyEnterprise.Gateways.GatewayE.CLX.Tags.ProductionCount",
        "vqts":[
                {
                "v": 264 ,
                "q": 192 ,
                "t":"2016-06-24T16:39:45.683+0000"
                }
    ]
},              {
    "fqn":".Gateways.GatewayE.CLX.Tags.StateDetailed",
        "vqts":[
                {
                "v": "" ,
                "q": 192 ,
                "t":"2016-06-24T16:39:45.683+0000"
                }
    ]
}           ]

Мой запрос не дает результата. когда я удаляю метку времени с помощью y.arrayvalue.t и добавляю y.arrayvalue.t в предложение group by, я получаю некоторый результат. Я понимаю, что, возможно, это связано с тем, что у меня есть более 1 поля временной метки для каждого события, поэтому я хотел знать, можно ли присвоить временные данные первого массива временной метке с помощью... что-то вроде временной метки по y [0] .t


person Aparna    schedule 01.07.2016    source источник


Ответы (1)


На сегодняшний день Azure Stream Analytics не поддерживает отметку времени по значению внутри массива. Таким образом, ответ на ваш вопрос «можно ли присвоить временные данные первого массива временной метке» НЕТ.

Вот обходной путь, который вы можете использовать:

Сначала объедините входное сообщение в одном задании и выведите его в промежуточный концентратор событий:

WITH flattenTS AS
(
    SELECT
       TS.ArrayIndex,
       TS.ArrayValue.FQN,
       TS.ArrayValue.vqts
    FROM [EventHubInput]
    CROSS APPLY GetArrayElements(hub.timeseries) AS TS
)
, flattenVQTS AS
(
    SELECT
        ArrayIndex
        ,FQN
        ,vqts.ArrayValue.v as v
        ,vqts.ArrayValue.q as q
        ,vqts.ArrayValue.t as t
    FROM flattenTS TS
    CROSS APPLY GetArrayElements(TS.vqts) AS vqts
)

SELECT *
INTO [staging_eventhub]
FROM flattenVQTS

Затем используйте другое задание, чтобы прочитать плоские сообщения и выполнить оконную агрегацию:

SELECT
    FQN
    ,MAX(CAST(v as BIGINT))-MIN(CAST(v as BIGINT)) as ppm
FROM [staging_eventhub] timestamp by t
WHERE fqn LIKE '%Production%' and q=192
GROUP BY tumblingwindow(minute,1), fqn

Вы можете задаться вопросом, можем ли мы просто объединить два вышеуказанных задания как несколько шагов в одном задании и избежать промежуточного концентратора событий. К сожалению, вы не можете использовать «отметку времени» при выборе из CTE или подзапроса сегодня.

person MinHe-MSFT    schedule 02.07.2016