Google BigQuery getQueryResults 为有效的作业 ID 返回 404 错误

Posted

技术标签:

【中文标题】Google BigQuery getQueryResults 为有效的作业 ID 返回 404 错误【英文标题】:Google BigQuery getQueryResults returning 404 Error for valid Job Id 【发布时间】:2014-01-27 12:36:39 【问题描述】:

我已经使用自己的作业 ID 成功创建了 Google 查询作业。并且能够再次使用作业ID并在昨天取得了成功的结果。 但同样的工作 id 不能正常工作。 我已经在 google bigquery UI 中尝试了带有项目 ID 的作业 ID,得到了与下面的“404”相同的错误


 "error": 
  "errors": [
   
    "domain": "global",
    "reason": "notFound",
    "message": "Not Found: Table<projectId:some random generated String.some random generated String>"
   
  ],
  "code": 404,
  "message": "Not Found: Table <projectId:some random generated String.some random generated String>
 

请帮帮我,约伯有生命时间吗?或者在创建工作 ID 以永久工作时需要任何特定配置?

我正在使用 Google Bigquery 的 Java API 来执行上述实现。找到下面使用的逻辑: 查询作业创建逻辑:

String query = "SELECT count(*) AS TOTAL_RECORDS FROM :dataset.:tablename;"

    String expectedJobId = "someuniqueString";
    JobConfigurationQuery queryConfig = new JobConfigurationQuery()
                        .setQuery(query);
                queryConfig.setUseQueryCache(true);

                JobConfiguration config = new JobConfiguration()
                        .setQuery(queryConfig);

                JobReference jobReference = new JobReference();
                jobReference.setJobId(expectedJobId);
                jobReference.setProjectId(PROJECT_ID);

                Job job = new Job().setId(expectedJobId).setConfiguration(
                        config);
                job.setJobReference(jobReference);
                            job = bigqueryService.jobs()
                                    .insert(PROJECT_ID, job).execute();

使用上述 JobId 检索到的结果:

GetQueryResults queryRequest = bigqueryService.jobs()
                    .getQueryResults(PROJECT_ID, expectedJobId);
            GetQueryResultsResponse queryResponse = queryRequest.execute();

【问题讨论】:

您的请求是什么样的?您能否显示创建作业的请求和响应? Jason,我添加了有关请求创建逻辑的更多详细信息。您还想要其他详细信息吗? 我认为您无法指定作业 ID。您提供的任何值都将被忽略。而不是使用 expectedJobId 你应该使用 job.getId() - 看看是否有帮助 Jason,预期的作业 ID 已正确设置为大查询中的作业 ID,并且可以正常工作超过一天。但在那之后它就不起作用了。并且 job.getId() 提供相同的值。 【参考方案1】:

您看到的错误不是查找作业的问题,而是查找结果表的问题。正如您所注意到的,对于特定工作,getQueryResults() 最多只能工作 24 小时;之后,为存储结果而创建的表将过期并被清理。

如果您发现这发生在 24 小时窗口内,您可能需要检查以确保作业确实成功完成。您可以使用bigqueryService.jobs.get()查看工作状态。

如果这没有帮助,如果您发送作业 ID,我们(BigQuery 团队)可以在服务器日志中查找该作业的情况。

【讨论】:

感谢 Jordan。就我而言,作业 ID 可以正常工作 24 小时,之后只有我遇到了这个问题。如果我将以下代码用于现有的 Job Id,我可以在接下来的 24 小时内再次获得结果,对吗?如果我的理解有误,请纠正我。 bigqueryService.jobs().get(PROJECT_ID, expectedJobId) .execute(); 上述查询有输入吗? 如果您希望查询结果的可用时间超过 24 小时,您需要为查询指定目标表。 (见***.com/questions/14622526/…)。【参考方案2】:

有时问题是数据集位置不正确。在我的代码中,我有一个配置,我在执行查询时根据该配置设置数据集位置。我搞砸了位置并开始收到此错误。经过2小时的调试终于找到了问题。

更正了数据集的位置,它工作正常。

【讨论】:

以上是关于Google BigQuery getQueryResults 为有效的作业 ID 返回 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

com.google.cloud.bigquery.BigQueryException:读取超时

将表从 google bigquery 导出到 google 存储

Google BigQuery 的 Google App Engine 授权

使用命令行将数据从 BigQuery 加载到 Google 表格中

Google 标准 SQL UDF - 写入 BigQuery

将数据从 Google 永久磁盘加载到 BigQuery?