AWS IoT Analytics Delta Window
У меня возникли реальные проблемы с работой окна Delta Window ( документов) AWS IoT Analytics.
Я пытаюсь настроить его так, чтобы каждый день выполнялся запрос, чтобы получить только последние 1 час данных. Согласно документам schedule
Функция может быть использована для запуска запроса с помощью выражения cron (в моем случае каждый час) и delta window
должен ограничить мой запрос, чтобы включить только записи, которые находятся в указанном временном окне (в моем случае последний час).
SQL-запрос, который я выполняю, просто SELECT * FROM dev_iot_analytics_datastore
и если я не включаю никакое окно разницы, я получаю записи как ожидалось. К сожалению, когда я включаю дельта-выражение, я ничего не получаю (никогда). Я оставил данные накапливаться около 10 дней, поэтому в базе данных есть пара миллионов записей. Учитывая, что я не был уверен, какой будет оптимальный формат, я включил в записи следующие временные поля:
datetime : 2019-05-15T01:29:26.509
(A string formatted using ISO Local Date Time)
timestamp_sec : 1557883766
(A unix epoch expressed in seconds)
timestamp_milli : 1557883766509
(A unix epoch expressed in milliseconds)
AWS также автоматически добавляет значение __dt
который использует тот же формат, что и мой datetime
за исключением того, что кажется точным с точностью до 1 дня. т.е. все значения, введенные в течение данного дня, имеют одинаковое значение (например, 2019-05-15 00:00:00.00
)
Я пробовал ряд выражений (включая предлагаемое выражение AWS) из стандартного SQL и Presto, так как не уверен, какое из них используется для этого запроса. Я знаю, что они используют подмножество Presto для аналитики, поэтому имеет смысл использовать его для дельты, но в документах просто говорится "... любое допустимое выражение SQL".
Выражения, которые я пробовал до сих пор без удачи:
from_unixtime(timestamp_sec)
from_unixtime(timestamp_milli)
cast(from_unixtime(unixtime_sec) as date)
cast(from_unixtime(unixtime_milli) as date)
date_format(from_unixtime(timestamp_sec), '%Y-%m-%dT%h:%i:%s')
date_format(from_unixtime(timestamp_milli), '%Y-%m-%dT%h:%i:%s')
from_iso8601_timestamp(datetime)
5 ответов
Какие параметры смещения и выражения времени вы используете?
Поскольку дельта-окна являются фильтрами, вставленными в ваш SQL, вы можете устранить их, вручную вставив выражение фильтра в запрос вашего набора данных.
А именно, применение фильтра дельта-окна с -3-минутным (отрицательным) смещением и выражением времени from_unixtime(my_timestamp) к запросу "SELECT my_field FROM my_datastore" преобразуется в эквивалентный запрос:
SELECT my_field FROM
(SELECT * FROM "my_datastore" WHERE
(__dt between date_trunc('day', iota_latest_succeeded_schedule_time() - interval '1' day)
and date_trunc('day', iota_current_schedule_time() + interval '1' day)) AND
iota_latest_succeeded_schedule_time() - interval '3' minute < from_unixtime(my_timestamp) AND
from_unixtime(my_timestamp) <= iota_current_schedule_time() - interval '3' minute)
Попробуйте использовать аналогичный запрос (без дельта-фильтра времени) с правильными значениями для смещения и выражения времени и посмотрите, что вы получите. (_Dt между...) - это просто оптимизация для ограничения сканируемых разделов. Вы можете удалить его в целях устранения неполадок.
Пожалуйста, попробуйте следующее:
- Установить запрос на
SELECT * FROM dev_iot_analytics_datastore
- Фильтр выбора данных:
- Окно выбора данных:
Delta time
- Смещение: -1 часов
- Выражение метки времени:
from_unixtime(timestamp_sec)
- Окно выбора данных:
- Подождите некоторое время, пока содержимое набора данных запустится, скажем, 15 минут или больше.
- Проверьте содержимое
Я случайно обнаружил, что меняетсяSELECT * FROM datastore
кSELECT id1, id2, ... FROM datastore
решил проблему.
После нескольких недель тестирования и проверки всех предложений в этом посте, а также многих других, кажется, что чрезвычайно технический ответ был "выключить и снова включить". Я удалил весь стек аналитики и перестроил все под разными именами, и теперь кажется, что он работает!
Важно, что хотя я пометил это как правильный ответ из-за фактического разрешения. Оба ответа, предоставленные Populus и Roger, верны, если мое развертывание функционирует Roger.
Использование этих функций в SQL-запросе решило проблемы:
- : возвращает метку времени текущего запроса.
- : возвращает метку времени предыдущего успешного запроса.
Итак, следующий запрос:
SELECT <field_1>, <field_2>, <...>
FROM <datastore_name>
WHERE from_unixtime(<timestamp_field>) BETWEEN
iota_current_schedule_time() AND
iota_latest_succeeded_schedule_time()
Вы извлекаете данные, хранящиеся в хранилище данных между предыдущим успешным запросом и фактическим запросом. Это то же действие, что и в окне Дельта. from_unixtime()
функция возвращает тот же тип, что иiota_current_schedule_time()
иiota_latest_succeeded_schedule_time()
.
Дополнительную информацию о типе отметки времени можно найти здесь: https://prestodb.io/docs/current/functions/datetime.html.