任意标签的BigQuery Schema设计

时间:2016-09-24 01:18:48

标签: google-bigquery google-cloud-bigtable

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

另一个要求是数据支持任意标记作为键/值对(例如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来说是一个很好的解决方案,那是因为到目前为止我一直在使用它。看似无法克服的问题是我的数据集中的系列基数,所以我正在寻找替代方案。

2 个答案:

答案 0 :(得分:1)

BigQuery Legacy 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

答案 1 :(得分:0)

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

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