使用Python的BigQuery客户端|超时和轮询问题
我试图通过初始化BQ客户端在BQ数据库上执行一条SQL语句。这已经顺利运行了一段时间,但最近看到一个问题。
我的代码在试图等待来自数据库的结果时失败了
query_job = client.query(QUERY) # API request to start the query
db_rslt = query_job.result() # Wait for the query to return results
以下是错误信息:
File "/opt/conda/default/lib/python3.7/site-packages/google/cloud/bigquery/job.py", line xxx, in result super(QueryJob, self).result(retry=retry, timeout=timeout) File "/opt/conda/default/lib/python3.7/site-packages/google/cloud/bigquery/job.py", line xxx, in result return super(_AsyncJob, self).result(timeout=timeout) File "/opt/conda/default/lib/python3.7/site-packages/google/api_core/future/polling.py", line xxx, in result self._blocking_poll(timeout=timeout, retry=retry, polling=polling) TypeError: _blocking_poll() got an unexpected keyword argument 'retry'
在结果方法中添加了超时参数,但没有起到作用。
pip freeze
将打印出已安装的Python软件包和版本信息的列表。
- John Hanley 2022-12-04
这取决于你所安装的google-cloud-bigquery库的版本,如果你使用的是1.x版本,请确保将google-api-core设置为低于1.34.0的版本。
实际发生的情况是,当你安装google-cloud-bigquery时,其他一些google相关的库也会自动安装,google-api-core就是这些库之一。然而,一个更高的版本正在被安装,从而导致了这个问题。
在我的例子中,设置我的google-api-core==1.33.2就可以解决这个问题。其他解决方案是将google-cloud-bigquery升级到更高版本。
7天前,谷歌发布了一个更新到google-api-core==1.34.0
的错误修复。我想,如果你没有使用google-cloud-bigquery
的后期版本,这引入了一些破坏性的变化。你可以选择。
- 将
google-api-core
固定到以前的工作版本(例如1.33.2)。 - 将
google-cloud-bigquery
升级到最新的版本。
我通过将bigquery的版本改为最新的:'google-cloud-bigquery==3.4.0',解决了这一问题。
我也遇到了这种情况,我的Python图像是3.8.13:bulleye
。 它使用的是下面的google库的堆栈。
google-auth==1.33.0
google-cloud-bigquery==1.25.0
google-cloud-firestore==2.3.1
把它们改成
db-dtypes==1.0.0
google-auth==2.6.0
google-cloud-bigquery==3.0.1
google-cloud-firestore==2.5.3
解决了这些问题。
db-dtypes
是新版本的谷歌云库所需要的。