When I execute this Java code :
(note : string parameters are dummy examples)
package bigquery.test;
import java.io.FileInputStream;
import java.io.InputStream;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.Table;
import com.google.cloud.bigquery.TableId;
public class GoogleBigQueryErrors {
static BigQuery __bigquery__;
public static void main(String[] args) {
try {
prepare();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
TableId tableId = com.google.cloud.bigquery.TableId.of("DATA_SET", "TABLE");
Table table = __bigquery__.getTable(tableId);
Job job = table.load(com.google.cloud.bigquery.FormatOptions.json(),
"gs://URI_PATH/HASH.bigquery.json");
Job completedJob = null;
try {
completedJob = job.waitFor(); // HERE THE ERROR IS RAISED
} catch (Exception e) {
e.printStackTrace();
System.exit(2);
}
}
private static void prepare() throws Exception {
String projectId = "PROJECT_ID";
String credentialsFile = "PATH/FILE.json";
InputStream credentialsStream = new FileInputStream(credentialsFile);
GoogleCredentials credentials = GoogleCredentials.fromStream(credentialsStream);
BigQueryOptions options = BigQueryOptions.newBuilder().setProjectId(projectId).setCredentials(credentials)
.build();
BigQuery bigquery = options.getService();
__bigquery__ = bigquery;
;
}
}
I have this error : com.google.cloud.bigquery.BigQueryException: Error while reading data, error message: JSON table encountered too many errors, giving up. Rows: 1; errors: 1. Please look into the errors[] collection for more details.
I want to iterate this errors collection, but I did not succeed to 🙁
Can someone please give me an hint ?
I found something in Python:
- Retrieving BigQuery validation errors when loading JSONL data via the Python API
- BigQuery – Where can I find the error stream?
But I did not succeed to have a Java equivalent.
I looked into JavaDoc : https://javadoc.io/doc/com.google.cloud/google-cloud-bigquery/latest/index.html
- “com.google.cloud.bigquery.Job” object has no “getErrors” method (or something equivalent).
- I saw a “com.google.cloud.bigquery.BigQueryErrorMessages” object, but I did not succeed to get it from the above “Job” object.
Advertisement
Answer
The error was in my “catch” block header. I catched a generic Exception raiser than a specific BigQueryException. BigQueryException has a getErrors method wich contains all the errors.
try {
completedJob = job.waitFor(); // HERE THE ERROR IS RAISED
} catch (BigQueryException e) {
List<BigQueryError> errors = e.getErrors();
Exception metaE = null;
if (null != errors) {
StringBuffer message = new StringBuffer(e.getMessage()).append("rn");
int errorNumber = errors.size();
int errorIndex = 0;
for (BigQueryError error : errors) {
message = message.append("error ").append(++errorIndex).append("/").append(errorNumber)
.append(" : ").append(error.getMessage()).append("rn");
}
metaE = new Exception(message.toString(), e.getCause());
metaE.setStackTrace(e.getStackTrace());
} else {
metaE = e;
}
throw metaE;
} catch (Exception e) {
throw e;
}
So console output is :
Exception in thread "main" java.lang.Exception: Error while reading data, error message: JSON table encountered too many errors, giving up. Rows: 1; errors: 1. Please look into the errors[] collection for more details.
error 1/3 : Error while reading data, error message: JSON table encountered too many errors, giving up. Rows: 1; errors: 1. Please look into the errors[] collection for more details.
error 2/3 : Error while reading data, error message: JSON processing encountered too many errors, giving up. Rows: 1; errors: 1; max bad: 0; error percent: 0
error 3/3 : Invalid NUMERIC value: 2010-08-31 00:00:00.000000 Field: num; Value: 2010-08-31 00:00:00.000000
at com.google.cloud.bigquery.Job.reload(Job.java:419)
at com.google.cloud.bigquery.Job.waitFor(Job.java:252)
at test.Ticket37120GoogleBigQueryErrors.main(Ticket37120GoogleBigQueryErrors.java:38)
And the error root cause in now clear : Invalid NUMERIC value