1

BigQuery を使用してセンサー データを時系列で保存する可能性を調査しています。意図は、データを BQ に保存し、それを Pandas で処理することです...これまでのところとても良いです... Pandas は TIMESTAMP フィールド インデックスを解釈し、シリーズを作成できます。

追加の要件は、データがキーと値のペアとして任意のタグをサポートすることです (例: 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 の優れた修正のように見えると思われる場合は、それは私がこれまで使用してきたものだからです。一見克服できない問題は、データ セット内のシリーズ カーディナリティの量です。そのため、代替手段を探しています。

4

2 に答える 2

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
于 2016-09-24T01:44:57.220 に答える
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 
于 2016-09-25T04:15:17.503 に答える