2016-09-24 100 views
1

我在研究使用BigQuery以时间序列存储传感器数据的可行性。目的是将数据存储在BQ中,并将其处理成Pandas ......迄今为止这么好...... Pandas可以解释TIMESTAMP字段索引并创建一个Series。任意标签的BigQuery架构设计

另一个要求是数据支持任意标签作为键/值对(例如job_id = 1234,task_id = 5678)。 BigQuery的可记录类型重复场很好地支持这一点:

    {'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的一个很好的修复,这是因为这是我迄今为止使用的。看似不可逾越的问题是我的数据集中的系列基数的数量,所以我正在寻找替代品。

+0

为什么标记python,熊猫和时间序列? – Kartik

+0

重要的是,您可以使用投票下方已发布答案左侧的勾号标记接受的答案。请参阅http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work#5235了解其重要性。答案投票也很重要。表决有用的答案。还有更多......当某人回答你的问题时,你可以查看该怎么做 - http://stackoverflow.com/help/someone-answers。 –

回答

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