任意标签的 BigQuery Schema 设计

BigQuery Schema design for arbitrary tags

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

另一个要求是数据支持任意标签作为 key/value 对(例如 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"
                                    },
                                ]
                            },
                       ]
                   }

这非常适合存储数据,如果我只需要过滤单个key/value组合

,它甚至非常适合查询
SELECT measurement_1 FROM measurements 
WHERE tag.name = 'job_id' AND tag.value = '1234'

但是,我还需要能够在查询表达式中组合标签集,但我似乎无法做到这一点。例如这个查询 returns 没有结果

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 的一个很好的修复,那是因为到目前为止我一直在使用它。看似无法克服的问题是我的数据集中系列基数的数量,所以我正在寻找替代方案。

旧版 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

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

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