Java上的BigQuery数据迁移

时间:2017-03-14 16:36:18

标签: java google-bigquery

我有两个BigQuery连接:

  1. 客户端BiqQuery连接(具有只读权限)
  2. 应用程序BigQuery连接。
  3. 两个连接(BiqQuery服务)都有很多数据集。 因此,我创建了两个具有不同凭据(客户端和应用程序)的bean(存储库)。

    我需要在客户端BigQuery服务中执行查询,从查询中获取结果(我在 GetQueryResultsResponse 中获取)并将其传输到 Application BigQuery服务喜欢新表。

    我尝试使用 GetQueryResultsResponse 中的表格方案在 Application BigQuery服务中创建新表格,在我执行查询后,我将新行添加到表格中。但在这种情况下我有问题 - 在BigQuery中插入并不会立即完成。数据添加了一段时间,我在插入后立即需要数据。

    问题: 也许有办法将这些数据保存到文件中并在将来使用它? 有没有办法将查询结果中的数据从一个Google BigQuery服务转移到另一个?

      

    我的代码:

    //get data from client service
    GetQueryResultsResponse resultsResponse = executeQuery(query);
    TableSchema schema = resultsResponse.getSchema();
    Table table = new Table();
    table.setSchema(schema);
    
    TableReference tableRef = new TableReference();
    tableRef.setDatasetId(applicationDataSetId);
    tableRef.setProjectId(projectId);
    tableRef.setTableId(tableId);
    //create new table in Application BigQuery environment
    try {
    Bigquery.Tables.Insert insert = getApplicationBigQueryService().tables().insert(projectId, applicationDataSetId, table);
    insert.execute();
    } catch (IOException e) {
    }
    
    TableDataInsertAllRequest content = new TableDataInsertAllRequest();
    List<TableDataInsertAllRequest.Rows> bigQueryRows = new ArrayList<>();
    
    List<Map<String, Object>> rows2 = new ArrayList<>();
    
    Map<String, Object> tableCell = new TableCell();
    tableCell.put("customer_master_id", 1);
    tableCell.put("formulary_name", "FOR");
    tableCell.put("quarter", "2014");
    tableCell.put("lives", 1234213);
    tableCell.put("source", "BOT");
    
    
    TableDataInsertAllRequest.Rows row = new TableDataInsertAllRequest.Rows();
    row.setJson(tableCell);
    bigQueryRows.add(row);
    
    TableDataInsertAllRequest.Rows insertRows = new TableDataInsertAllRequest.Rows();
    
    insertRows.setJson(tableCell);
    bigQueryRows.add(insertRows);
    
    content.setRows(bigQueryRows);
    // send insert request to BigQuery
    Bigquery.Tabledata.InsertAll request = getBentoBigQueryService().tabledata().insertAll(projectId, bentoDataSetId,tableId, content);
    
    //insert data to table
    TableDataInsertAllResponse response = request.execute();
    log.info(response.toString());
    if (response.containsKey(INSERT_ERRORS)) {
    throw new JobException(String.format(ERROR_SYNC_MSG, response));
    }
    } catch (IOException ex) {
    log.warn(ERROR_SYNC_MSG, ex);
    throw new JobException(String.format(ERROR_SYNC_MSG, ex.getMessage()));
    }
    

    感谢。

1 个答案:

答案 0 :(得分:0)

这似乎是一种在BigQuery内部移动数据的奇怪方法。如果查看可以为查询设置的许多选项,则可以明确地将结果具体化为命名目标表,并设置适当的创建/写入处置将控制是否在目标中追加或替换数据。

假设您拥有源(读取)和目标(写入)的适当权限,可以在数据集和项目之间完成。

如果您没有使用查询操作架构或结果并只是复制数据,您可能还需要查看表复制作业。