我们正在为bq.py编写一个包装器,并且在结果集大于100k行时遇到一些问题。似乎在过去这种方法运行良好(我们与Google BigQuery Incomplete Query Replies on Odd Attempts有相关问题)。也许我不理解doc page上解释的限制?
例如:
#!/bin/bash
for i in `seq 99999 100002`;
do
bq query -q --nouse_cache --max_rows 99999999 "SELECT id, FROM [publicdata:samples.wikipedia] LIMIT $i" > $i.txt
j=$(cat $i.txt | wc -l)
echo "Limit $i Returned $j Rows"
done
收益率(注意有4行格式化):
Limit 99999 Returned 100003 Rows
Limit 100000 Returned 100004 Rows
Limit 100001 Returned 100004 Rows
Limit 100002 Returned 100004 Rows
在我们的包装器中,我们直接访问API:
while row_count < total_rows:
data = client.apiclient.tabledata().list(maxResults=total_rows - row_count,
pageToken=page_token,
**table_dict).execute()
# If there are more results than will fit on a page,
# you will recieve a token for the next page
page_token = data.get('pageToken', None)
# How many rows are there across all pages?
total_rows = min(total_rows, int(data['totalRows'])) # Changed to use get(data[rows],0)
raw_page = data.get('rows', [])
我们希望在这种情况下获得一个令牌,但不会返回任何令牌。
答案 0 :(得分:1)
我可以使用bq命令行重现您所看到的行为。这似乎是一个错误,我会看到我能做些什么来修复它。
我确实注意到您要查询的数据的一件事是仅选择id字段,并将行数限制在100,000左右。这会产生大约约1M的数据,因此服务器可能不会对结果进行分页。选择大量数据将强制服务器进行分页,因为它无法在单个响应中返回所有结果。如果你选择* 100,000行样本。维基百科你将得到~50M,这应该足以开始看到一些分页发生。
您是否看到来自python客户端的结果太少,或者您对sample.wikipedia查询没有返回page_token感到惊讶?
答案 1 :(得分:1)
我能够识别服务器端存在的错误,您最终会看到Java客户端以及python客户端。我们计划在接下来的一周推出修复方案。一旦发生这种情况,您的客户应该开始正确行事。
顺便说一下,我不确定你是否已经知道这一点,但是你可以使用一个独立的python客户端从python访问API。我认为这可能比作为bq.py的一部分分发的客户端更方便。您可以在此页面上找到指向它的链接: https://developers.google.com/bigquery/client-libraries