Подсчет отсутствующих файлов или записей в таблице - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть таблица в Big Query, используемая для целей мониторинга. В этой таблице указана по крайней мере следующая информация (поля):

+--------------------------------+-----------+-----------+--------+----------------+
|           timestamp            | data_type | file_name | status | loaded records |
+--------------------------------+-----------+-----------+--------+----------------+
| 2020-04-02 19:51:11.822674 UTC | aa        | e.gz      | OK     |           2293 |
| 2020-04-02 20:00:06.261044 UTC | bb        | g.gz      | OK     |             25 |
| 2020-04-02 20:02:07.304114 UTC | cc        | cd.csv    | OK     |            298 |
| 2020-04-02 20:09:26.708910 UTC | dd        | ab.csv    | OK     |          49448 |
| 2020-04-02 20:31:00.662977 UTC | ee        | ad.csv    | OK     |           4805 |
| 2020-04-02 20:37:41.459875 UTC | ff        | f.bz      | OK     |            245 |
+--------------------------------+-----------+-----------+--------+----------------+ 
 

Метка времени - это метка времени при получении файла системой

Тип_данных указывает, из какого типа данных и источника информации система собирает данные. источник данных. Тип данных также указывает количество файлов, ожидаемых от каждого источника данных, и они варьируются от источника к источнику. Ожидается, что некоторые источники будут генерировать данные ежечасно, некоторые ежедневно, некоторые каждые 15 минут, а некоторые каждые 5 минут.

Давайте предположим, что в приведенной выше таблице data_type aa и bb создаются каждые 5 минут; следовательно, ожидаемое вхождение - 12 файлов в час. Тип данных cc и dd создаются каждый час, а data_type ee и ff создаются ежедневно.

Filename - это имя файла, связанного с типом данных. Поэтому частота появления этого файла в отчете ежечасно или ежедневно зависит от типа данных. Если быть точным, если он связан с типом данных aa и bb, то для этого типа данных будет отображаться 12 файлов в час или 288 в день. Для почасовых типов данных, таких как cc и dd, ожидается один раз в час или 12 вхождений в день и т. Д.

По разным причинам время от времени наблюдаются пропущенные файлы, что влияет на качество данных.

Я бы хотел посчитать недостающие файлы каждого типа данных за желаемый период времени; возможно, ежечасно (относится к почасовому типу данных), ежедневно (для всех типов данных)) и ежемесячно (для всех типов данных). Это будет визуализироваться с использованием таких инструментов визуализации, как Google DataStudio или tableau.

Ожидаемый результат (таблица) будет

Date (или dateTime) Data_type count_missing_files

Как мне это сделать? новая таблица в bq и какой будет запрос для этого? Могу ли я просто сделать это напрямую с визуализацией с добавленной логи c вместо создания новой таблицы? Если да, как это сделать?

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Поскольку вы остаетесь в своем вопросе, вы можете использовать BigQuery для создания таблицы, которая будет построена с использованием Data-Studio.

Вы можете использовать приведенный ниже запрос, чтобы получить таблицу с числом ожидаемых файлов в пределах определенный временной интервал обозначается разницей между <END TIMESTAMP> и <START TIMESTAMP>. Я использовал предложение WITH, в котором данные, которые вы показываете в описании, записываются вместе с дополнительным полем frecuency_file_generation_minutes. В этом столбце я добавил время, необходимое для создания различных файлов (в минутах): 5 для "aa" и "bb", 60 для "cc" и "dd" и 24 * 60 для "ee" и "ff". Вычисление time_window_minutes/frecuency_file_generation_minutes предоставляет количество ожидаемых файлов в указанном интервале диапазона.

WITH
  data AS (
  SELECT
    TIMESTAMP "2020-04-02 19:51:11.822674" AS timestamp,
    "aa" AS data_type,
    "e.gz" AS file_name,
    "OK" AS status,
    2293 AS loaded_records,
    5 AS frecuency_file_generation_minutes
  UNION ALL
  SELECT
    TIMESTAMP "2020-04-02 20:00:06.261044" AS timestamp,
    "bb" AS data_type,
    "g.gz" AS file_name,
    "OK" AS status,
    25 AS loaded_records,
    5 AS frecuency_file_generation_minutes
  UNION ALL
  SELECT
    TIMESTAMP "2020-04-02 20:02:07.304114" AS timestamp,
    "cc" AS data_type,
    "cd.gz" AS file_name,
    "OK" AS status,
    298 AS loaded_records,
    60 AS frecuency_file_generation_minutes
  UNION ALL
  SELECT
    TIMESTAMP "2020-04-02 20:09:26.708910" AS timestamp,
    "dd" AS data_type,
    "ab.gz" AS file_name,
    "OK" AS status,
    49448 AS loaded_records,
    60 AS frecuency_file_generation_minutes
  UNION ALL
  SELECT
    TIMESTAMP "2020-04-02 20:31:00.662977" AS timestamp,
    "ee" AS data_type,
    "ad.gz" AS file_name,
    "OK" AS status,
    4805 AS loaded_records,
    24*60 AS frecuency_file_generation_minutes
  UNION ALL
  SELECT
    TIMESTAMP "2020-04-02 20:37:41.459875" AS timestamp,
    "ff" AS data_type,
    "f.gz" AS file_name,
    "OK" AS status,
    245 AS loaded_records,
    24*60 AS frecuency_file_generation_minutes ) 
SELECT
  *, 
  FLOOR(time_window_minutes/frecuency_file_generation_minutes) AS expected_files
FROM (
  SELECT 
  *,
  TIMESTAMP_DIFF(<END TIMESTAMP>, <START TIMESTAMP>, MINUTE) time_window_minutes
  FROM data
  WHERE
    timestamp BETWEEN <START TIMESTAMP>
    AND <END TIMESTAMP>
  )

Можно сравнить ожидаемые файлы expected_files с фактически сгенерированными файлами за заданный интервал времени. В выходную таблицу я включил все поля, но вы можете адаптировать этот запрос, чтобы он лучше подходил вашему варианту использования.

0 голосов
/ 04 апреля 2020

Я думаю, вы могли бы сделать это в Таблице. Создайте вычисляемое поле, показывающее ожидаемое количество файлов. Как лучше всего это сделать, зависит от того, как вы хотите сообщить об этом. Если отчитываться ежечасно, то это будет на часовом уровне, который будет суммироваться до ежедневного. При ежедневном отчете это будет ожидаемое число в день.

Пример почасового вычисления поля

CASE [Data Type]
WHEN 'aa' THEN 12
WHEN 'bb' THEN 12
...
END

Если «целевая» формула верна, тогда просто вычислить разницу между количество целевых записей и фактическое количество записей с простой суммой. Например:

SUM([Target) - SUM([Number of Records])
...