Хранение данных на основе времени и выявление пробелов - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть несколько миллионов датчиков, которые постоянно выполняют проверки работоспособности и отправляют данные каждые 5 minutes на сервер.Моя задача состоит в том, чтобы хранить эти точки данных и каждый час генерировать отчет о тех, которые не смогли сообщить.

Вопросы:

  • Какая база данных оптимальна для таких операций?(sql / nosql) а какой конкретно?Индексами будут строки.
  • Какой может быть оптимальный запрос для выбранной выше базы данных

Пример данных:

"point1"    "12-2-19T00:00"
"point2"    "12-2-19T00:00"
"point1"    "12-2-19T00:05" #missing point2
"point1"    "12-2-19T00:10"
"point2"    "12-2-19T00:10"

Мне нужно найти точку2

1 Ответ

0 голосов
/ 21 февраля 2019

Ниже для BigQuery Standard SQL

#standardSQL
WITH temp AS (
  SELECT point, PARSE_TIMESTAMP('%d-%m-%yT%H:%M', dt) dt
  FROM `project.dataset.table`
), points AS (
  SELECT DISTINCT point FROM temp
), times AS (
  SELECT dt
  FROM (SELECT MIN(dt) min_dt, MAX(dt) max_dt FROM temp), 
  UNNEST(GENERATE_TIMESTAMP_ARRAY(min_dt, max_dt, INTERVAL 5 MINUTE)) dt
)
SELECT 
  point, 
  FORMAT_DATETIME('%d-%m-%yT%H:%M', DATETIME(dt)) dt, 
  IF(t.point IS NULL, 'missing', 'ok') status
FROM times CROSS JOIN points 
LEFT JOIN temp t USING(dt, point)

Вы можете протестировать, поиграть с выше, используя примеры данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'point1' point, '12-2-19T00:00' dt UNION ALL
  SELECT 'point2', '12-2-19T00:00' UNION ALL
  SELECT 'point1', '12-2-19T00:05' UNION ALL -- #missing point2
  SELECT 'point1', '12-2-19T00:10' UNION ALL
  SELECT 'point2', '12-2-19T00:10' 
), temp AS (
  SELECT point, PARSE_TIMESTAMP('%d-%m-%yT%H:%M', dt) dt
  FROM `project.dataset.table`
), points AS (
  SELECT DISTINCT point FROM temp
), times AS (
  SELECT dt
  FROM (SELECT MIN(dt) min_dt, MAX(dt) max_dt FROM temp), 
  UNNEST(GENERATE_TIMESTAMP_ARRAY(min_dt, max_dt, INTERVAL 5 MINUTE)) dt
)
SELECT 
  point, 
  FORMAT_DATETIME('%d-%m-%yT%H:%M', DATETIME(dt)) dt, 
  IF(t.point IS NULL, 'missing', 'ok') status
FROM times CROSS JOIN points 
LEFT JOIN temp t USING(dt, point)
-- ORDER BY dt, point   

с результатом

Row point   dt              status   
1   point1  12-02-19T00:00  ok   
2   point2  12-02-19T00:00  ok   
3   point1  12-02-19T00:05  ok   
4   point2  12-02-19T00:05  missing  
5   point1  12-02-19T00:10  ok   
6   point2  12-02-19T00:10  ok   
...