Лучший способ проанализировать такие сложные события - это пользовательская функция JavaScript. К сожалению, функции JavaScript не допускаются в выражении TIMESTAMP BY. Возможно, вы захотите разделить это на два запроса - один без TIMESTAMP BY, который «нормализует» данные и извлекает обязательные поля, и второй запрос, который использует TIMESTAMP BY и выполняет агрегирование окон.
я есть файл JSON, как показано ниже:
{"imei": {"imei": "358174069248418F", "imeiBinary": "NYF0BpJIQY8 =", "imeiNotEncoded": "358174069248418", "valid": 1}, "dataPackets": [["msy.mxet.at .AlarmNotification ", {" version ": 1," id ": 21," op ": 2," sizeDynamic ": 0," alarmStatus ": 4}], [" msy.mxp.datapacket.IOStatus ", {" версия ": 1," id ": 15," op ": 2," sizeDynamic ": 0," ioStatus ": 135," ioDirections ": 120}], [" msy.mxp.datapacket.LogicalStatus ", {" версия ": 1," id ": 16," op ": 2," sizeDynamic ": 0," logicStatus ": 5}], [" msy.mxp.datapacket.Position ", {" version ": 1," id ": 19," op ": 2," широта ": 40.835243," долгота ": 14.246057," высота ": 40," скорость ": 0," курс ": 68," gpsNumSatell ": 5," glonassNumSatell " : 1, "fixValid": 1, "timeValid": 1, "wgs84degMinFormat": 1, "glonass": 1, "fixMode": 3, "timestamp": {"timeSecFrom1Gen2000": 925560202, "time": 1490648755000} , "sizeDynamic": 0}]]}
и я читаю по следующему запросу:
WITH Datapackets AS
(
SELECT imei.imei as imei,
persistent as persistent,
[timestamp].[time] as input_time,
compressed as compressed,
GetArrayElement(dataPackets, 3) as position
FROM h24
), one as(
SELECT *,
GetRecordPropertyValue (GetArrayElement(position,1), 'timestamp') as position_timestamp --1st
from Datapackets
), two as (
select
imei,
GetRecordPropertyValue (GetArrayElement(position,1), 'op') as position_OP,
[position_timestamp].[time] as position_time,
dateadd(S, [position_timestamp].[timeSecFrom1Gen2000], '1970-01-01') as timing,
GetRecordPropertyValue (GetArrayElement(position,1), 'latitude') as position_latitude,
GetRecordPropertyValue (GetArrayElement(position,1), 'longitude') as position_longitude,
GetRecordPropertyValue (GetArrayElement(position,1), 'altitude') as position_altitude,
GetRecordPropertyValue (GetArrayElement(position,1), 'speed') as position_speed
from one) SELECT * from two
Теперь я хочу сделать падающую группу окна на 30 секунд следующим образом, но у меня есть проблема, которая говорит мне, что свойство метки времени не разрешено для входного файла «два», вот запрос, который я использую
WITH Datapackets AS
(
SELECT imei.imei as imei,
persistent as persistent,
[timestamp].[time] as input_time,
compressed as compressed,
GetArrayElement(dataPackets, 3) as position
FROM h24
), one as(
SELECT *,
GetRecordPropertyValue (GetArrayElement(position,1), 'timestamp') as position_timestamp --1st
from Datapackets
), two as (
select
imei,
GetRecordPropertyValue (GetArrayElement(position,1), 'op') as position_OP,
[position_timestamp].[time] as position_time,
dateadd(S, [position_timestamp].[timeSecFrom1Gen2000], '1970-01-01') as timing,
GetRecordPropertyValue (GetArrayElement(position,1), 'latitude') as position_latitude,
GetRecordPropertyValue (GetArrayElement(position,1), 'longitude') as position_longitude,
GetRecordPropertyValue (GetArrayElement(position,1), 'altitude') as position_altitude,
GetRecordPropertyValue (GetArrayElement(position,1), 'speed') as position_speed
from one) SELECT imei, System.TimeStamp AS 'start', Avg(position_speed), max(position_latitude)
FROM two TIMESTAMP BY TIMING GROUP BY imei, TumblingWindow(duration(second, 30))
Ошибка появляется в последних двух строках (ИЗ двух TIMESTAMP BY TIMING),
************** Обновление ,, изучив больше, я обнаружил, что я могу использовать только опцию timestamp by во входных данных, и я должен использовать ее, только если я сделаю индивидуальную метку времени для события. Обычно они помечены временем прибытия по умолчанию (https://msdn.microsoft.com/en-us/library/mt573293.aspx)
Теперь моя проблема состоит в том, как поставить метку времени в моих событиях с полем времени, записанным в массиве 3-го уровня в файле Json, чтобы иметь возможность выполнять агрегацию.
Любые предложения о том, как я справляюсь с этой проблемой, спасибо