2016-09-24 99 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