【问题标题】:BigQuery Schema design for arbitrary tags适用于任意标签的 BigQuery 架构设计
【发布时间】:2017-02-01 22:52:07
【问题描述】:

我正在研究使用 BigQuery 按时间序列存储传感器数据的可行性。目的是将数据存储在 BQ 中并在 Pandas 中处理......到目前为止一切都很好...... Pandas 可以解释 TIMESTAMP 字段索引并创建一个系列。

另一个要求是数据支持任意标签作为键/值对(例如 job_id=1234、task_id=5678)。 BigQuery 可以使用 RECORD 类型的 REPEATED 字段很好地支持这一点:

                   {'fields':
                       [
                           {
                               "mode": "NULLABLE",
                               "name": "timestamp",
                               "type": "TIMESTAMP"
                           },
                           {
                               "mode": "REPEATED",
                               "name": "tag",
                               "type": "RECORD",
                               "fields":
                               [
                                    {
                                        "name":"name",
                                        "type":"STRING"
                                    },
                                    {
                                        "name":"value",
                                        "type":"STRING"
                                    },
                                    {
                                        "mode": "NULLABLE",
                                        "name": "measurement_1",
                                        "type": "FLOAT"
                                    },
                                    {
                                        "mode": "NULLABLE",
                                        "name": "measurement_2",
                                        "type": "FLOAT"
                                    },
                                    {
                                        "mode": "NULLABLE",
                                        "name": "measurement_3",
                                        "type": "FLOAT"
                                    },
                                ]
                            },
                       ]
                   }

这对于存储数据非常有用,如果我只需要过滤单个键/值组合,它甚至对于查询也非常有用

SELECT measurement_1 FROM measurements 
WHERE tag.name = 'job_id' AND tag.value = '1234'

但是,我还需要能够在查询表达式中组合标签集,但我似乎无法完成这项工作。例如此查询不返回任何结果

SELECT measurement_1 FROM measurements 
WHERE tag.name = 'job_id' AND tag.value = '1234'
      AND tag.name = 'task_id' AND tag.value = '5678'

问题:是否可以使用此架构制定查询来执行我想要的操作?将此类变量数据附加到 Big Query 中原本固定的架构的推荐方法是什么?

感谢您的任何帮助或建议!

注意:如果您认为这看起来像是对 InfluxDB 的一个很好的修复,那是因为这是我迄今为止一直在使用的。看似无法克服的问题是我的数据集中的系列基数,所以我正在寻找替代方案。

【问题讨论】:

  • 为什么要标记 python、pandas 和时间序列?
  • 重要的是,您可以使用已发布答案左侧投票下方的勾号来标记已接受的答案。请参阅meta.stackexchange.com/questions/5234/… 了解为什么它很重要。对答案进行投票也很重要。投票选出有帮助的答案。还有更多...您可以查看当有人回答您的问题时该怎么做 - stackoverflow.com/help/someone-answers

标签: google-bigquery google-cloud-bigtable


【解决方案1】:

BigQuery 旧版 SQL

SELECT measurement_1 FROM measurements 
OMIT RECORD IF
  SUM((tag.name = 'job_id' AND tag.value = '1234')
   OR (tag.name = 'task_id' AND tag.value = '5678')) < 2

BigQuery 标准 SQL

SELECT measurement_1 FROM measurements 
WHERE (
  SELECT COUNT(1) FROM UNNEST(tag) 
  WHERE ((name = 'job_id' AND value = '1234')
      OR (name = 'task_id' AND value = '5678'))
) >= 2

【讨论】:

    【解决方案2】:

    重复是存储数据系列、集合等的好方法。
    为了从重复的字段中过滤掉一个感兴趣的值,我会使用以下模板

    SELECT 
        MAX( IF( filter criteria,  value_to_pull, null)) WITHIN RECORD AS some_name
    FROM <table>
    

    你的情况如下:

    SELECT
      MAX(IF(tag.name = 'job_id' AND tag.value = '1234', measurement_1, NULL)) WITHIN RECORD AS job_1234_meassurement_1,
      MAX(IF(tag.name = 'task_id' AND tag.value = '5678', measurement_1, NULL)) WITHIN RECORD AS task_5678_meassurement_1,
      FROM measurements 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-18
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 2011-07-10
      • 1970-01-01
      相关资源
      最近更新 更多