- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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
.鉴于此,您的查询无法找到新插入的行,因为您的 _PARTITIONTIME
是NULL
.确保值是 NULL
在最近插入数据的伪列中,您可以运行以下查询。
如果要查看所有行的伪列,请运行 SELECT *, _PARTITIONTIME p from <DATASET_ID>.<TABLE_ID>
如果要获取伪列为空的所有行,运行SELECT * from <DATASET_ID>.<TABLE_ID> WHERE _PARTITIONTIME is null
最后,我想为这个主题添加一些有用的引用。
希望对你有帮助
关于google-bigquery - 在摄取时进行分区时,Bigquery 中查询数据延迟的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60913773/
我是一名优秀的程序员,十分优秀!