任意标签的 BigQuery Schema 设计
BigQuery Schema design for arbitrary tags
我正在研究使用 BigQuery 按时间序列存储传感器数据的可行性。目的是将数据存储在 BQ 中并在 Pandas 中处理它......到目前为止一切顺利...... Pandas 可以解释一个 TIMESTAMP 字段索引并创建一个系列。
另一个要求是数据支持任意标签作为 key/value 对(例如 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"
},
]
},
]
}
这非常适合存储数据,如果我只需要过滤单个key/value组合
,它甚至非常适合查询
SELECT measurement_1 FROM measurements
WHERE tag.name = 'job_id' AND tag.value = '1234'
但是,我还需要能够在查询表达式中组合标签集,但我似乎无法做到这一点。例如这个查询 returns 没有结果
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 的一个很好的修复,那是因为到目前为止我一直在使用它。看似无法克服的问题是我的数据集中系列基数的数量,所以我正在寻找替代方案。
旧版 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
重复是存储数据系列、集合等的好方法
为了从重复的字段中过滤出一个兴趣的值,我将使用以下模板
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
我正在研究使用 BigQuery 按时间序列存储传感器数据的可行性。目的是将数据存储在 BQ 中并在 Pandas 中处理它......到目前为止一切顺利...... Pandas 可以解释一个 TIMESTAMP 字段索引并创建一个系列。
另一个要求是数据支持任意标签作为 key/value 对(例如 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"
},
]
},
]
}
这非常适合存储数据,如果我只需要过滤单个key/value组合
,它甚至非常适合查询SELECT measurement_1 FROM measurements
WHERE tag.name = 'job_id' AND tag.value = '1234'
但是,我还需要能够在查询表达式中组合标签集,但我似乎无法做到这一点。例如这个查询 returns 没有结果
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 的一个很好的修复,那是因为到目前为止我一直在使用它。看似无法克服的问题是我的数据集中系列基数的数量,所以我正在寻找替代方案。
旧版 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
重复是存储数据系列、集合等的好方法
为了从重复的字段中过滤出一个兴趣的值,我将使用以下模板
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