python - 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 |
|---------------------|------------------|
所以我有一个很好的分区,但我不知道为什么,拜托?各位大神能解释一下这个问题吗?
解决方案
我正在添加一些信息,希望可以帮助您解决您的问题:
1.喜欢5000行还是10000行?请问我们有机会知道吗?
基于Checking for data availability,缓冲区是基于时间的而不是基于大小的,并且数据最多可能需要 90 分钟才能变得可用。此外,UNPARTITIONED 分区将包含与流缓冲区关联的所有数据;因此,查询此分区可以了解缓冲区中有多少行。
2. ...我一直等到我的数据超出流式缓冲区(实际上我一直等到流式缓冲区统计信息在我的表的详细信息中消失)那请问有什么问题吗?
可能存在同步问题,但我想知道您如何确定流是空的。Doc 说需要“检查名为 streamingBuffer 的部分的 tables.get 响应”。此外,streamingBuffer.oldestEntryTime 字段可用于识别流缓冲区中行的年龄。如果服务没有将数据提取到最终分区,则存在 UNPARTITIONED 分区是正确的。
3. 一个分区很好,但我不知道为什么,好吗?各位大神能解释一下这个问题吗?
我同意张华的观点,当你在流式传输时,数据被缓冲在 UNPARTITIONED 分区中,这就是为什么你只有那个分区(一段时间后,最多 90 分钟,数据将被传送到正确的分区)。但是,当您将数据直接加载到表中时,这些行会立即发送到正确的分区 (19265786)。
您可能会对BigQuery 流式插入的生命周期一文感兴趣,以了解有关流式和分区表的更多信息。
推荐阅读
- php - 307 在 Chrome 中加载页面时临时移动了代码
- ios - 如何以编程方式向 StackView 中的每个按钮添加单独的选择器/侦听器 swift 4.2
- css - Material UI 中的样式如何改变焦点标签的颜色?
- c# - 如何在我的网格中实现用户控件的拖动选择
- eclipse - 由于 http 受到限制,无法在组织网络内访问 Eclipse 市场
- php - 在 symfony 中将值设置为 EntityType 的占位符选项
- java - 由于多重继承,Java 8 无法实现两个接口
- javascript - 从选择框获取值后计算
- json - Oracle ORA-40474 不一致
- arrays - 将 CSV 转换为 JSON,其中一些 JSON 键具有多个值