簡體   English   中英

BigQuery Python Client Library 中查詢結果的差異

[英]Difference of query results in BigQuery Python Client Library

我想知道 query() 的返回值和 query().result()s' 之間的區別。

在 BigQuery Python 客戶端庫中,

bigquery_client = bigquery.Client()
myQuery = "SELECT * FROM `mytable`"

## NOTE: This query result has just 1 row.
job = bigquery_client.query(myQuery)
for row in job:
    val1 = row

result = job.result()
for row in result:
    val2 = row

print(job == result) # False. I know QueryJob object is different to RowIterator object.
print(val1 == val2) # True

為什么 val1 和 val2 等價? 對於非常大的查詢,這些值可以不同嗎?

這是一個長達一年的自我回答。

基本上,我的代碼中的“工作”和“結果”是不同的。

bigquery_client.query() 返回 QueryJob 實例。 (參見https://googleapis.dev/python/bigquery/latest/generated/google.cloud.bigquery.client.Client.html#google.cloud.bigquery.client.Client.query

但是 QueryJob class 有自己的 _ iter _ 方法並且它返回 iter(self.result()) (參見https://github.com/googleapis/python-bigquery/blob/main/google/cloud/bigquery/job/query .py#L1778 )

所以 'job' 成為 for-in 循環的 result() 的迭代器。

因此,job.= result 但 val1 == val2。

query() 方法用於執行 SQL 查詢。 BigQuery 將所有查詢結果保存到永久或臨時表中。查詢完成后,臨時表最多存在 24 小時,如果我們將結果寫入新表,它將成為永久表。

將查詢結果寫入永久表時,您可以使用包含 result() 方法 i 的 Python 代碼。 query().results() 用於將查詢數據寫入新的永久表。

所以基本上 query() 和 query.results() 給出了相同的 output 但在 query().results() 中提取的數據被存儲到一個新表中,而在 query() 中數據位於一個臨時表中。

根據您的問題 val1==val2 您得到了正確的結果,因為 query() 和 query().results() 獲取的數據相同,但存儲方式不同。

我正在提供與此相關的公共文檔鏈接。

編寫查詢結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM