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 между...) - это просто оптимизация для ограничения сканируемых разделов. Вы можете удалить его в целях устранения неполадок.

Пожалуйста, попробуйте следующее:

  1. Установить запрос на SELECT * FROM dev_iot_analytics_datastore
  2. Фильтр выбора данных:
    • Окно выбора данных: Delta time
    • Смещение: -1 часов
    • Выражение метки времени: from_unixtime(timestamp_sec)
  3. Подождите некоторое время, пока содержимое набора данных запустится, скажем, 15 минут или больше.
  4. Проверьте содержимое

Я случайно обнаружил, что меняется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.

Другие вопросы по тегам