【发布时间】:2018-06-28 18:54:04
【问题描述】:
我收到此错误
Cannot set destination table in jobs with DDL statements
当我尝试从 google.cloud.bigquery 库中的 job.build_resource() 函数重新提交作业时。
似乎在该函数调用之后目标表设置为类似这样。
'destinationTable': {'projectId': 'xxx', 'datasetId': 'xxx', 'tableId': 'xxx'},
我在这里做错了吗?感谢任何可以在这里给我任何指导的人。
编辑:
作业最初是由此触发的
query = bq.query(sql_rendered)
我们存储作业 ID 并在以后使用它来检查状态。
我们得到这样的工作
job = bq.get_job(job_id=job_id)
如果它满足一个条件,在这种情况下它由于速率限制而失败。我们重试该作业。
我们像这样重试工作
di = job._build_resource()
jo = bigquery.Client(project=self.project_client).job_from_resource(di)
jo._begin()
我认为这几乎是您需要的所有代码,但如果需要,我们很乐意提供更多。
【问题讨论】:
-
请分享更多您正在使用的代码。仅从错误消息中无法判断导致设置目标表的原因。
-
您是否有理由不重新提交原始作业?提交
bq.get_job返回的那个有点奇怪,因为它包含不相关的属性,如查询统计信息等(在本例中是目标表)。 -
原因是我们使用的是Airflow。所以它是通过 xcoms 传递的,所以我们存储了 job_id,抓取它然后使用它。我们应该改变那个工作流程吗?
-
(简单的)替代方法是剥离您返回相关字段的工作资源,但更好的长期解决方案可能是传播您想要的原始工作或查询跑步。不过,鉴于您当前的设置,很难说哪个更合理。
标签: python-3.x google-bigquery google-cloud-python