当前位置: 首页 > 知识库问答 >
问题:

(BigQuery PY客户端库v0.28)-从表“查询”作业获取结果

薛扬
2023-03-14

我正在学习使用Python客户端库v0的BigQueryAPI。28https://googlecloudplatform.github.io/google-cloud-python/latest/bigquery/usage.html#run-简单查询

编写了以下简单代码以从表中获取数据

1) 创建客户端对象

client_ = bigquery.Client.from_service_account_json('/Users/xyz/key.json')

2) 开始新的异步查询作业

QUERY =  'SELECT visitid FROM `1234567.ga_sessions_20180101`'
query_job = client_.query(QUERY
                      , job_id=str(uuid.uuid4()))

3)轮询,直到查询完成

while (query_job.state == 'RUNNING'):
    time.sleep(5)
    query_job.reload()

4) 在迭代中获取结果

query_job.reload()        
iter = query_job.result() 

在这个阶段,我想获取表中有多少行。根据文件,GitHub代码iter属于bigquery类型。桌子具有属性的行迭代器[层总行数][1]

5)然而,在我打印的这个阶段:

print(iter.total_rows)

它一直返回

我很确定这个表不是空的干查询格式正确!

干杯

共有2个答案

轩辕季同
2023-03-14

RowIterator返回无的当前行为确实令人困惑。幸运的是,根据这个问题,tswast 10天前的评论表明开发人员正在寻找更好的解决方案。

目前,。只有迭代开始时,才会初始化总行数。(为了清楚起见,我将iter变量重命名为row\u iter

row_iter = query_job.result()
itr = iter(row_iter)
first_row = next(itr)
print(row_iter.total_rows)  # Now you get a number instead of None.

这很难看,因为要继续迭代,我们必须要么以不同的方式处理第一行,要么再次调用row_iter=query_job.result()

当前工作的替代方案是使用query_job的值。_query_results.total_rows。不幸的是,这是作弊,因为_query_results是私有的,所以没有理由期望这在未来会起作用。

如果tswast的建议得到实施,则row\u iter。总行数将在开始时初始化,正如您所期望的那样。

在我的代码中,我会用这样的东西

try:
    num_rows = row_iter.total_rows or query_job._query_results.total_rows
except NameError:
    num_rows = None

与未来行为兼容,同时在必要时返回临时解决方案。

万俟沛
2023-03-14

您还需要检查query_job.error_result以确保查询成功。

您还可以在UI中看到您的作业,这对于调试很有用,使用项目id和作业id:

https://bigquery.cloud.google.com/results/projectid: jobid

此外,query_job.result()已经等待作业完成,因此不需要轮询。

 类似资料:
  • 问题内容: 我需要知道客户的IP地址,这是我的鳕鱼 处理程序: 结果: 为什么我无法获得真正的客户IP? 问题答案: 通常,您可以用来获取正在访问Web应用程序的客户端的IP地址。但是,如果用户位于代理服务器后面或通过负载均衡器访问您的Web服务器(例如,在云托管中),则上述代码段将获取代理服务器或负载均衡器服务器的IP地址,而不是原始IP地址客户。 因此,您应该获得请求的HTTP标头“ X-Fo

  • 我使用python客户端通过SQL创建表,如文档(https://cloud.google.com/bigquery/docs/tables)中所述: 除了用于通过SQL查询创建表的客户机函数使用了一个job_config对象,而job_config接收的是一个table_ref,而不是table对象之外,这种方法工作得很好。 我在这里找到了用于创建表的文档,其描述如下:https://googl

  • 问题内容: 自将我的Nest客户端升级到2.2.1之后,我无法看到要提交给我的elasticsearch客户端(现在为2.3.0版)的查询。我曾经用这条线: 但是,此方法现在返回void而不是它以前使用的JSON。ConnectionStatus也不存在,所以我再也看不到我发送的json了,有人知道吗?CallDetails.RequestBodyInBytes可用,但返回null。 问题答案:

  • 问题内容: 根据MSDN,返回已执行查询的列元数据。我想知道是否有类似的方法将为给定查询提供表元数据?我的意思是涉及哪些表以及它具有什么别名。 在我的应用程序中,我得到了查询,并且需要以编程方式附加该子句。使用,我可以获取列元数据及其所属的表。但是,即使表具有别名,它仍然会返回真实的表名。有没有办法获取该表的别名? 以下代码显示如何获取列元数据。 这将为我正确提供列的详细信息。但是当我看到列时,它

  • 您可以get get client-go的一个版本,例如get get k8s.io/client-go/1.4/...或者获取k8s.io/client-go/1.4/kubernetes。 现在当我这么做的时候。这是输出- 警告:“k8s.io/client-go/1.4/...”匹配的无包无法加载包:包。:/users/shubhadeeproychowdhury/projects/Go/s

  • 有没有办法检索客户端在GraphQL查询中请求的字段列表? 假设我有以下类型: 在Java端,在用@GraphQLQuery注释的方法中,有没有方法知道客户机请求的字段? 例如,具有以下查询: 我可以知道第一个查询请求了图书的标题和类型字段,第二个请求了图书的标题以及作者的姓名? 谢谢马西莫