2016-09-24 4 views
1

BigQueryを使用してセンサデータを時系列に格納する可能性を検討しています。その目的は、BQにデータを格納し、それをPandasで処理することです。これまでのところとても良い... Pandasは、TIMESTAMPフィールドのインデックスを解釈してSeriesを作成することができます。BigQuery任意のタグのスキーマ設計

追加の要件は、データをキー/値のペアとして任意のタグをサポートしていることである(例えばJOB_ID = 1234 TASK_ID = 5678)。 BigQueryはRECORD型の繰り返しフィールドとうまくこれをサポートすることができます

    {'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、pandas、および時系列のタグですか? – 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

は、データ系列を格納するための素晴らしい方法です、コレクションなど
繰り返しフィールドからの値だけをフィルタリングするためには、 1人の関心私は、次のテンプレートを使用することになり

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 
関連する問題