加载作业尝试使用 java 将 json 插入 BigQuery 表时解析错误

Posted

技术标签:

【中文标题】加载作业尝试使用 java 将 json 插入 BigQuery 表时解析错误【英文标题】:Error in parsing while load job tries to insert json to BigQuery table using java 【发布时间】:2015-11-04 09:07:36 【问题描述】:

我正在尝试这个,

    Job job = new Job();
    JobConfiguration config = new JobConfiguration();
    JobConfigurationLoad loadConfig = new JobConfigurationLoad();
    config.setLoad(loadConfig);
    job.setConfiguration(config);

    // Set where you are importing from (i.e. the Google Cloud Storage paths).
    List<String> sources = new ArrayList<String>();
    sources.add(GCS_URL);
    loadConfig.setSourceUris(sources);

    boolean tableExists =checkTableExists(bigquery,projectId,datasetId,tableName);
    System.out.println("Whether table exists "+tableExists);

    TableReference tableRef = new TableReference();
    tableRef.setProjectId(projectId);
    tableRef.setDatasetId(datasetId);
    tableRef.setTableId(tableName);

    if(!tableExists)
    
        System.out.println("Create table");
    Table table = new Table();
    table.setSchema(getSchemaForBqTable(tableName));   
    table.setTableReference(tableRef);
    bigquery.tables().insert(projectId,datasetId,table).execute();
    


    loadConfig.setDestinationTable(tableRef);
    loadConfig.setSchema(getSchemaForBqTable(tableName));


    Insert insertJob =bigquery.jobs().insert(projectId, job);    
    insertJob.setProjectId(projectId);
    JobReference jobId  = insertJob.execute().getJobReference();


and also polling the status and error results ..
while (true) 
      pollJob = bigquery.jobs().get(projectId, jobId.getJobId()).execute();
      elapsedTime = System.currentTimeMillis() - startTime;
      System.out.format("Job status (%dms) %s: %s\n", elapsedTime,
          jobId.getJobId(), pollJob.getStatus().getState());

      if (pollJob.getStatus().getErrorResult() != null) 
          // The job ended with an error.
           System.out.format("Job %s ended with error %s", jobId.getJobId(),pollJob.getStatus().getErrorResult().getMessage(), projectId);
           throw new RuntimeException(String.format("Job %s ended with error %s", jobId.getJobId(), 
                   pollJob.getStatus().getErrorResult().getMessage()));       
            

      if (pollJob.getStatus().getState().equals("DONE")) 
        return pollJob;
      

我收到以下错误

作业状态 (601ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (1899ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (3235ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (5505ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (7621ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (8904ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (10188ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (11461ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (13615ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (14890ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (16160ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (17444ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (19602ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (20887ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (22168ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: PENDING 作业状态 (24359ms) job_vJWfyum4tsmECoiBrygQ6PZn73c: RUNNING 线程“main”中的异常作业状态(25643ms)job_vJWfyum4tsmECoiBrygQ6PZn73c:完成 作业 job_vJWfyum4tsmECoiBrygQ6PZn73c 以错误结束 右双引号 (") 和字段分隔符之间的数据:字段开头为:java.lang.RuntimeException:作业 job_vJWfyum4tsmECoiBrygQ6PZn73c 以错误结尾 右双引号 (") 和字段分隔符之间的数据:字段开头为: 在 com.disney.facebook.LoadJob.checkQueryResults(LoadJob.java:181) 在 com.disney.facebook.LoadJob.main(LoadJob.java:72)

--------------------------------------------------------------------------------------------------------------------------------------------------------

使用 bq 命令检查作业状态...在异常下方...

C:\Program Files (x86)\Google\Cloud SDK>bq show -j job_inR4kMvXQCcpcTujY7nEC-LZs BQ Job brilliobigquery-991:job_inR4kMvXQCcpcTujY7nEC-LZsBQ

作业类型 状态 开始时间 持续时间 字节 已处理字节 账单 ed 计费层



加载失败 04 Nov 12:18:32 0:00:01

作业执行期间遇到的错误。右双引号 (") 和之间的数据 字段分隔符:字段以: 故障详情: - 文件:0 / 行:1 / 字段:2:右双引号 (") 和 字段分隔符:字段以: - 文件:0 / 行:1 / 字段:3:右双引号 (") 和 字段分隔符:字段以: - 文件:0 / 行:1 / 字段:4:右双引号 (") 和 字段分隔符:字段以: - 文件:0 / 行:1 / 字段:5:右双引号 (") 和 字段分隔符:字段开头:

要上传的文件会有这样的内容。

“channel_skey”:“124”,“the_date”:“1444953600”,“total_subscribers”:“782904”,“total_subscribing”:“21”,“rec_insert_ts”:“1444953600”,“rec_update_ts”:“1444953600 " “channel_skey”:“125”,“the_date”:“1444953600”,“total_subscribers”:“50359”,“total_subscribing”:“0”,“rec_insert_ts”:“1444953600”,“rec_update_ts”:“1444953600”

请帮我解决这个问题。

【问题讨论】:

哪里有将 JSON 或 CSV 设置为输入的代码? 【参考方案1】:

您需要将源格式设置为 NEWLINE_DELIMITED_JSON。该作业正在尝试将您的数据解析为 CSV。

API 参考:

https://cloud.google.com/bigquery/docs/reference/v2/jobs#configuration.load.sourceFormat

Java 客户端库参考:

https://developers.google.com/resources/api-libraries/documentation/bigquery/v2/java/latest/com/google/api/services/bigquery/model/JobConfigurationLoad.html#setSourceFormat(java.lang.String)

【讨论】:

以上是关于加载作业尝试使用 java 将 json 插入 BigQuery 表时解析错误的主要内容,如果未能解决你的问题,请参考以下文章

在使用 BigQuery API 的 python 插入作业期间登录失败

使用java.Without使用作业加载数据,将json数据流式传输到Bigquery

BigQuery 加载作业 [无效] 遇到太多错误

SQLite Room 快速插入 JSON 数组

BigQuery 加载作业不会插入所有数据

无法通过java中的QueryBuilder将json插入cassandra