使用Java SDK我正在为一个具有相当复杂模式的记录创建一个加载作业。在监视加载作业的状态时,需要花费相当长的时间(但这可能是由于制定了模式),但随后说:
11:21:06.975 [main] INFO xxx.GoogleBigQuery - Job status (21694ms) create_scans_1384744805079_172221126: DONE
11:24:50.618 [main] ERROR xxx.GoogleBigQuery - Job create_scans_1384744805079_172221126 caused error (invalid) with message
Too many errors encountered. Limit is: 0.
11:24:50.810 [main] ERROR xxx.GoogleBigQuery - {
"message" : "Too many errors encountered. Limit is: 0.",
"reason" : "invalid"
?}
顺便说一句 - 我如何告诉作业使用Java可能有多于零的错误?
此加载作业未出现在控制台中的最近作业列表中,据我所知,没有任何Java对象包含有关遇到的实际错误的更多详细信息。那么我怎样才能在语法上找出问题所在呢?我能找到的只有:
if (err != null) {
log.error("Job {} caused error ({}) with message\n{}", jobID, err.getReason(), err.getMessage());
try {
log.error(err.toPrettyString());
}
...
总的来说,我很难找到一些这些东西的好文档,并且通过试验和错误以及在这里和旧组中找到的短代码片段来解决问题。如果有比入门指南更好的信息来源,那么我将非常感谢任何指向该信息的指针。 Javadoc并没有真正帮助,我找不到任何有关加载,查询,错误测试,编目错误等的完整示例。
此作业通过NEWLINE_DELIMITIED_JSON记录提交,通过以下方式提供给作业:
InputStream dummy = getClass().getResourceAsStream("/googlebigquery/xxx.record");
final InputStreamContent jsonIn = new InputStreamContent("application/octet-stream", dummy);
createTableJob = bigQuery.jobs().insert(projectId, loadJob, jsonIn).execute();
我的身份验证等似乎可以作为列出项目的单独Java代码正常工作,并且项目中的数据集都可以正常工作。所以我只是需要帮助来处理实际错误 - 它不像模式(例如我有记录嵌套在记录中),或者它认为我提交的数据中存在错误。
提前感谢您的帮助。上面提到的工作号码是一个实际失败的负载工作,如果这可以帮助任何可能阅读此工作的谷歌员工。
答案 0 :(得分:3)
听起来你有几个问题,所以我会尽力解决这些问题。
首先,获取失败作业状态的方法是调用jobs()。get(jobId),它返回一个具有errorResult对象的作业对象,该对象具有导致作业失败的错误(例如“太多错误”)。 errorStream列表丢失了作业中的所有错误,它应该告诉您哪些行命中错误。
请注意,如果您有作业ID,则使用bq查找作业可能更容易 - 您可以运行bq show <job_id>
来获取作业错误信息。如果您添加--format=prettyjson
,它将打印出作业中的所有信息。
您可能还需要考虑的提示是在创建作业时提供自己的作业ID - 然后即使启动作业时出错(即insert()调用失败,可能是由于网络错误你可以查看工作,看看究竟发生了什么。
要告诉BigQuery在导入过程中允许一些错误,您可以在加载作业中使用maxBadResults
设置。请参阅https://developers.google.com/resources/api-libraries/documentation/bigquery/v2/java/latest/com/google/api/services/bigquery/model/JobConfigurationLoad.html#getMaxBadRecords()。