我们在BigQuery中有一个按日分区的表,它通过流式插入更新。
doc表示:"当流式传输到分区表时,流缓冲区中的数据对于_PARTITIONTIME伪列具有NULL值"
但是如果我查询bq show
它总是返回0,即使request({
method: 'GET',
url: 'https://www.huffingtonpost.com/',
}, function(error, response, body) {
if(error) {
console.log(error);
}
huffpost(body);
});
告诉我流式缓冲区中有很多行。
这是否意味着流缓冲区中的行根本不存在伪列?在任何情况下,如何在没有成为全表扫描的情况下仅在流缓冲区中查询数据?
提前致谢
答案 0 :(得分:3)
流式传输缓冲区中的数据NULL
列的值为_PARTITIONTIME
。
SELECT
fields
FROM
`dataset.partitioned_table_name`
WHERE
_PARTITIONTIME IS NULL
https://cloud.google.com/bigquery/docs/partitioned-tables#copying_to_partitioned_tables
答案 1 :(得分:2)
当您将数据流式传输到BQ时,您通常会进行预热"期间和流式数据可用于查询,复制和导出等操作的时间。
该文档最后指出,经过长达90分钟的时间后,伪列_PARTITIONTIME
会收到一个非空值,这意味着您的流数据已完全准备好用于您想要的任何类型的操作运行数据(能够运行查询通常需要几秒钟)。
这意味着你不会query partitioned tables在这个字段为空时寻找,而是你喜欢这样:
SELECT
fields
FROM
`dataset.partitioned_table_name`
WHERE
_PARTITIONTIME = TIMESTAMP('2017-01-20')
在此示例中,您将仅查询日期分区Jan / 20中流式传输的数据(这样可以避免全表扫描)。
您还可以选择一系列日期,只需将WHERE
子句更改为:
WHERE _PARTITIONTIME BETWEEN TIMESTAMP('2017-01-20') AND TIMESTAMP('2017-01-22')
哪个会在您的表格中查询2天。