gpt4 book ai didi

google-bigquery - 在摄取时进行分区时,Bigquery 中查询数据延迟的原因是什么?

转载 作者:行者123 更新时间:2023-12-02 16:44:09 27 4
gpt4 key购买 nike

我正在使用 bigquery 从我的 python 应用程序批处理 insert 数据。这些表在摄取时被分区。我看到的不同之处在于,我插入的数据会在摄取后 1.5 小时后出现用于 query

后来我更改了 schema 以包含一个 timestamp

这次我可以在摄取后立即查询数据。

为什么表 schema 中的 _PARTITIONTIME 伪列与 timestamp 列在行为上存在差异?

用于摄取的 PYTHON 代码:

这是代码的简化版本:

bigquery_client = bigquery.Client()
TABLE_REF = bigquery_client.dataset('DATASET_ID').table('TABLE_ID')
TABLE = bigquery_client.get_table(TABLE_REF)

def ingest_to_bq(data: LIST[LIST]):
bigquery_client.insert_rows(TABLE, data)

表架构:

[
{
"name": "epoch_ms",
"type": "INTEGER",
"mode": "REQUIRED"
},
{
"name": "application_id",
"type": "STRING",
"mode": "REQUIRED"
},
{
"name": "ack_id",
"type": "STRING",
"mode": "REQUIRED"
},
{
"name": "data",
"type": "STRING",
"mode": "REQUIRED"
}
]

从 BIGQUERY 接口(interface)创建表并在摄取时进行分区。

查询:

我使用 BIGQUERY 接口(interface)再次查询。

SELECT data from <DATASET_ID>.<TABLE_ID> WHERE _PARTITIONTIME="2020-03-30"

上面的查询不会显示被摄取的结果,比方说,半小时前。摄入后大约需要 1.5 小时才能得到结果。

新架构:

[
{
"name": "send_timestamp",
"type": "TIMESTAMP",
"mode": "REQUIRED"
},
{
"name": "application_id",
"type": "STRING",
"mode": "REQUIRED"
},
{
"name": "ack_id",
"type": "STRING",
"mode": "REQUIRED"
},
{
"name": "data",
"type": "STRING",
"mode": "REQUIRED"
}
]

查询新架构:

SELECT data from <DATASET_ID>.<TABLE_ID> WHERE send_timestamp>="2020-03-30 00:00:00" and send_timestamp<="2020-03-30 23:59:59"

此查询在摄取后立即返回结果。我不必等待。

最佳答案

此延迟的解释是 BigQuery流缓冲区。流缓冲区是一个缓冲区,它保留最近插入的行并针对写入吞吐量进行了优化。换句话说,当您将流式数据插入到 BigQuery 中时您的数据首先被插入到流式缓冲区中,最多可保留 90 分钟。此时,数据被认为是持久的,您可以查询它,但是您不能对其进行某些特定操作。

正如您在 documentation 中看到的那样,当您的数据位于流缓冲区 中时,您的_PARTITIONTIME伪列将是 NULL .鉴于此,您的查询无法找到新插入的行,因为您的 _PARTITIONTIMENULL .确保值是 NULL在最近插入数据的伪列中,您可以运行以下查询。

  1. 如果要查看所有行的伪列,请运行 SELECT *, _PARTITIONTIME p from <DATASET_ID>.<TABLE_ID>

  2. 如果要获取伪列为空的所有行,运行SELECT * from <DATASET_ID>.<TABLE_ID> WHERE _PARTITIONTIME is null

最后,我想为这个主题添加一些有用的引用。

  1. BigQuery 分区表的 reference .
  2. BigQuery 流式处理 reference .
  3. 一名官员 article关于流式传输到 BigQuery,其中讨论了流式缓冲区以及如何处理它。

希望对你有帮助

关于google-bigquery - 在摄取时进行分区时,Bigquery 中查询数据延迟的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60913773/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com