首页 > 解决方案 > BIGQUERY - 整数范围分区表中的 UNPARTITIONED 分区

问题描述

我尝试将数据写入我的整数范围分区表,并且我使用这篇文章作为我的参考。其实我的表有两列:customer_id(INT)和product_name(STRING),所以我用customer_id作为字段进行分区。另一方面,我读过的文章说:

对于流式传输,流式传输缓冲区中的数据位于 UNPARTITIONED 分区中。提取数据时,它最初停留在 UNPARTITIONED 分区中。当有足够的未分区数据时,会将其重新分区到特定的分区中。

当有足够的未分区数据时这句话真的让我很困惑,因为我不知道在这种情况下有多少数据行是“足够”的,比如 5000 行还是 10000 行?。请问我们有机会知道吗?

在我的演示中,一开始,我的表是空的,所以我将 4000 行(这 4000 行的相同 customer_id)流式传输到我的表中,我一直等到我的数据超出流式缓冲区(实际上我等到流式缓冲区统计信息消失在我的表的详细信息中),然后,我使用此查询来了解我有多少个分区:

#legacySQL
select table_id, partition_id
from [mydataset.customer_product$__PARTITIONS_SUMMARY__] 

结果是:

|---------------------|------------------|
|      table_id       |   partition_id   |
|---------------------|------------------|
|  customer_product   |__UNPARTITIONED__ |
|---------------------|------------------|

那么请问有什么问题吗?
此外,如果我通过下面的查询和查询设置的一些设置覆盖我的表,

-- change some settings in Query settings to overwrite the table
select *
from mydataset.customer_product

我会得到:(19265786 是 4000 个数据行的 customer_id)

|---------------------|------------------|
|      table_id       |   partition_id   |
|---------------------|------------------|
|  customer_product   |     19265786     |
|---------------------|------------------|

所以我有一个很好的分区,但我不知道为什么,拜托?各位大神能解释一下这个问题吗?

标签: pythonsqlgoogle-bigquery

解决方案


我正在添加一些信息,希望可以帮助您解决您的问题:

1.喜欢5000行还是10000行?请问我们有机会知道吗?

基于Checking for data availability,缓冲区是基于时间的而不是基于大小的,并且数据最多可能需要 90 分钟才能变得可用。此外,UNPARTITIONED 分区将包含与流缓冲区关联的所有数据;因此,查询此分区可以了解缓冲区中有多少行。

2. ...我一直等到我的数据超出流式缓冲区(实际上我一直等到流式缓冲区统计信息在我的表的详细信息中消失)那请问有什么问题吗?

可能存在同步问题,但我想知道您如何确定流是空的。Doc 说需要“检查名为 streamingBuffer 的部分的 tables.get 响应”。此外,streamingBuffer.oldestEntryTime 字段可用于识别流缓冲区中行的年龄。如果服务没有将数据提取到最终分区,则存在 UNPARTITIONED 分区是正确的。

3. 一个分区很好,但我不知道为什么,好吗?各位大神能解释一下这个问题吗?

我同意张华的观点,当你在流式传输时,数据被缓冲在 UNPARTITIONED 分区中,这就是为什么你只有那个分区(一段时间后,最多 90 分钟,数据将被传送到正确的分区)。但是,当您将数据直接加载到表中时,这些行会立即发送到正确的分区 (19265786)。

您可能会对BigQuery 流式插入的生命周期一文感兴趣,以了解有关流式和分区表的更多信息。


推荐阅读