반응형
SQL 문을 통해 데이터를 조작해보았다.
이제는 대량의 데이터를 한번이 insert 하는 bulk insert 기능을 구현해본다.
■ 호출부
void contextLoads() throws Exception {
System.out.println("############### start ###############");
String projectId = "project_id";
String datasetName = "dataset_name";
String tableName = "table_name";
Boolean bulkInsertResult1 = bulkInsertBigQuery(projectId, datasetName, tableName, "test1");
System.out.println("Bulk insert ==> " + bulkInsertResult1);
Boolean bulkInsertResult2 = bulkInsertBigQuery(projectId, datasetName, tableName, "test2");
System.out.println("Bulk insert ==> " + bulkInsertResult2);
System.out.println("############### end ###############");
}
■ 실행부
/**
* Stream insert
* @param projectId
* @param datasetName
* @param tableName
*/
public static Boolean bulkInsertBigQuery(String projectId, String datasetName, String tableName, String testValue) {
try {
BigQuery bigQuery = getBigQuery(projectId);
TableId tableId = TableId.of(projectId, datasetName, tableName);
List<InsertAllRequest.RowToInsert> rowContents = new ArrayList<>();
String bgDateTimeNow = ZonedDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "T"
+ ZonedDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"));
Map<String, Object> rowContent = null;
for ( int i = 0 ; i < 10000 ; i++ ) {
String rowId = ZonedDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSSSSS"))+i;
rowContent = new HashMap<>();
rowContent.put("col01", testValue);
rowContent.put("col02", i*10);
rowContent.put("col03", bgDateTimeNow);
// id는중복된 행을 식별하는데 사용됨.
rowContents.add(InsertAllRequest.RowToInsert.of(rowId, rowContent));
}
InsertAllResponse response = bigQuery.insertAll(InsertAllRequest.newBuilder(tableId)
//rowId를 지정하면, 해당 row에 등록 동일한 rowId가 있으면 update
//.addRow(UUID.randomUUID().toString(), rowContent)
.setRows(rowContents)
// More rows can be added in the same RPC by invoking .addRow() on the builder
.build());
if ( response.hasErrors() ) {
// If any of the insertions failed, this lets you inspect the errors
int errorCount = response.getInsertErrors().size();
List <com.google.cloud.bigquery.BigQueryError> aaa = response.getInsertErrors().get(0);
System.out.println("Total Error Count : " + errorCount);
String errorReason = response.getErrorsFor(0).get(0).getReason();
String errorLocation = response.getErrorsFor(0).get(0).getLocation();
String errorMessage = response.getErrorsFor(0).get(0).getMessage();
System.out.println("Error Reason\\t: " + errorReason);
System.out.println("Error Location\\t: " + errorLocation);
System.out.println("Error Message\\t: " + errorMessage);
return false;
} else {
return true;
}
} catch ( Exception e ) {
e.printStackTrace();
return false;
}
}
■ 결과
############### start ###############
Insert rows : : 10000
Bulk insert ==> true
Insert rows : : 10000
Bulk insert ==> true
############### end ###############
반응형
'GCP > BigQuery on GCP' 카테고리의 다른 글
JAVA 프로젝트로 GCP BigQuery TRUNCATE TABLE 후, bulk INSERT(Streaming buffer) "Table is truncated." 에러발생 (0) | 2023.01.17 |
---|---|
JAVA 프로젝트로 GCP BigQuery의 INSERT/UPDATE 쿼리 실행 해보기 (0) | 2023.01.16 |
JAVA 프로젝트로 GCP BigQuery의 Select 쿼리 실행 해보기 (0) | 2023.01.10 |
JAVA 프로젝트로 GCP BigQuery의 Dataset 가져오기 (0) | 2022.10.28 |
BigQuery Data Transfer Service 샘플 코드 (1) | 2022.09.07 |