【问题标题】:Counting missing files or records in a table计算表中丢失的文件或记录
【发布时间】:2020-04-03 23:37:21
【问题描述】:

我在 Big Query 中有一个用于监控目的的表。此表至少显示以下信息(字段):

+--------------------------------+-----------+---- --------+--------+----------------+ |时间戳 |数据类型 |文件名 |状态 |加载记录 | +--------------------------------+-----------+---- --------+--------+----------------+ | 2020-04-02 19:51:11.822674 UTC |啊 |例如 |好的 |第2293章 | 2020-04-02 20:00:06.261044 UTC | bb | g.gz |好的 | 25 | | 2020-04-02 20:02:07.304114 UTC |抄送| cd.csv |好的 | 298 | | 2020-04-02 20:09:26.708910 UTC | dd | ab.csv |好的 | 49448 | | 2020-04-02 20:31:00.662977 UTC |呃 |广告.csv |好的 | 4805 | | 2020-04-02 20:37:41.459875 UTC | ff | f.bz |好的 | 245 | +--------------------------------+-----------+---- --------+--------+----------------+

Timestamp 是系统收到文件时的时间戳

Data_type 表示系统从数据源收集的数据类型和信息来源。数据类型还指示每个数据源预期的文件数量,并且它们因源而异。有些来源预计每小时生成一次,有些每天生成一次,有些每 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 等可视化工具进行可视化。

预期结果(表格)将是

日期(或日期时间)数据类型 count_missing_files

我该怎么做? bq 中的新表,对此的查询是什么? 我可以直接通过添加逻辑的可视化而不是创建新表来简单地做到这一点吗?如果是,该怎么做?

任何帮助将不胜感激。

【问题讨论】:

    标签: sql google-bigquery tableau-api google-data-studio


    【解决方案1】:

    我认为您可以在 Tableau 中执行此操作。创建一个显示预期文件数的计算字段。如何最好地做到这一点取决于您要如何报告它。如果按小时报告,那么这将是按小时级别,总计为每天。如果每天报告,那么这将是每天的预期数量。

    每小时计算字段示例

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

    如果“目标”公式是正确的,那么通过简单的总和计算目标记录数和实际记录数之间的差异就很简单了。例如:

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

    【讨论】:

    • 这应该是一个非常简单的逻辑,但是当我应用这个 CASE [Data Type] WHEN 'aa' THEN 12 WHEN 'bb' THEN 12 ... END 在 tableau 中时,每小时文件只显示数字文件(记录)乘以 12,如果我将其更改为 1,那么它与该数据类型的文件数值相同,而不是该期间的预期文件数。对于预期的每日记录,它显示 3456 而不是 288。此外,当应用此 SUM([Target) - SUM([Number of Records]) 时,结果当然是不正确的。有什么提示或建议吗?
    • 是的,当然,每种数据类型会有不止一条记录。我早该想到的……
    • 您打算如何显示这些数据?解决方案可能取决于您希望如何显示数据。您可以选择参考线,将目标用作维度而不是度量(即常数),混合来自不同数据源的目标,并且目标计算也变得更加复杂。最佳选择取决于所需的输出。
    • 实际上我想以某种形式显示每种数据类型的缺失文件;可以根据需要(即每小时、每天、每周、每月)和表格格式(例如日期时间、数据类型和缺失记录(文件))汇总的随时间变化的直方图。此外,希望显示在所需时间段(即每天、每月)内每种数据类型的目标接收记录的百分比
    • 我认为目标计算给了我更多的灵活性;因此是首选。
    【解决方案2】:

    当您继续提出问题时,您可以使用 BigQuery 生成要使用 Data-Studio 绘制的表格。

    您可以使用下面的查询来检索一个表,其中包含<END TIMESTAMP><START TIMESTAMP> 之间的差异表示的特定时间范围间隔内的预期文件数。我使用了 WITH 子句,您在描述中显示的数据与额外字段 frecuency_file_generation_minutes 一起记录。在本专栏中,我添加了生成不同文件所需的时间(以分钟为单位):"aa""bb" 为 5,"cc""dd" 为 60,"ee" 和 @987654329 为 24*60 @。计算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 与实际生成的文件进行比较。在输出表中,我包含了所有字段,但您可以调整此查询以更好地适应您的用例。

    【讨论】:

    • 感谢您的提示,但似乎此查询需要预定义的时间窗口?我想要创建的只是时间戳、接收到的文件数、预期文件数以及接收到预期之间的比率,但时间跨度取决于我选择的图表;因此,标准将相应调整。对于 5 分钟文件类型,每日预期文件为 288,但如果我想每月显示此文件,则它将调整为该月的天数,例如每月 30*288 = 8640 或 31*288=8928 个文件。对于预计每小时的 data_type 也是如此。有什么提示吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多