向时间分区BigQuery表插入流式数据时数据未分区的原因是什么
原因说明
- 这是BigQuery流式写入时间分区表的默认设计:所有刚通过流式接口写入的数据,会先暂存在名为
__STREAMING_UNPARTITIONED__的临时缓冲分区中,不会立刻按照分区字段分配到对应的日期分区。 - 后台的异步分区分配任务一般会在数据写入后30~90分钟内执行,执行完成后数据会被自动迁移到对应日期的正式分区,
__STREAMING_UNPARTITIONED__中的对应数据也会同步清理。 - Legacy SQL的
__PARTITIONS_SUMMARY__元数据表本身不展示流式临时分区的信息,所以你用Legacy SQL查询的时候看不到最新日期的分区,只有标准SQL的INFORMATION_SCHEMA.PARTITIONS可以查询到这个临时分区的存在和数据量。
费用优化建议
- 写查询语句时必须加上明确的分区字段过滤条件:即使数据还在
__STREAMING_UNPARTITIONED__中,BigQuery也会自动过滤出符合条件的行,不会扫描整个临时分区的全量数据,不会产生额外的查询费用。 - 分区校验、元数据查询场景统一使用标准SQL查询
INFORMATION_SCHEMA.PARTITIONS,不要使用Legacy SQL的__PARTITIONS_SUMMARY__,避免因为看不到临时分区导致数据校验逻辑错误。 - 如果业务对分区实时性要求极高,无法接受最长90分钟的分区延迟,可以将流式写入切换为批量LOAD作业写入,批量写入的数据会直接进入对应正式分区,不会经过临时缓冲分区。
内容的提问来源于stack exchange,提问作者vreyespue
相关产品推荐
相关产品推荐

