我正在调查使用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来说是一个很好的解决方案,那是因为到目前为止我一直在使用它。看似无法克服的问题是我的数据集中的系列基数,所以我正在寻找替代方案。
答案 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