GCP bigquery 설정 시 에러가 발생했다. US 지역에서 데이터셋을 찾지 못한다는 에러인데. 원인은 지역 문제는 아니였고 projectId를 중복 지정했기 때문에 발생한 문제였다.
error
com.google.cloud.bigquery.BigQueryException: Not found: Dataset data:aaa was not found in location US setLocation
원인
이런식으로 쿼리 빌더에서도 projectId를 set해줬는데 sql from에서 테이블을 지정할 때도 projectId를 지정해줬기 때문에 문제가 생겼다.
BigQuery bigquery = BigQueryOptions.newBuilder().setProjectId("projectId")
.setCredentials(
ServiceAccountCredentials.fromStream(new FileInputStream(keyPath.toFile()))
).build().getService();
시도 1 실패
쿼리 빌더에 데이터셋 지역을 설정하기 위해 setLocation("asia-northeast3")을 사용
시도 2 실패
resources 디렉토리에 application.properties 파일 생성 후 key 파일 지정.
spring.cloud.gcp.credentials.location=file:/usr/local/key.json or
spring.cloud.gcp.credentials.location=classpath:/usr/local/key.json
시도 3 성공
.setProjectId("projectId") 제거.
package .repository;
import com.google.auth.oauth2.ServiceAccountCredentials;
import com.google.cloud.bigquery.*;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
@SpringBootTest
@ActiveProfiles("test")
public class BigqueryRepositoryTest {
String projectId = "projectId";
String datasetName = "datasetName";
String tableName = "tableName";
String from = "`" + projectId + "." + datasetName + "." + tableName + "`";
@Test
@DisplayName("데이터셋 조회")
void test_bigquery() {
String query =
"SELECT *\n"
+ " FROM "
+ from
+ " LIMIT 20";
query(query);
}
public void query(String query) {
try {
File file = new File("src/main/resources/credentials/gcp_key.json");
String absolutePath = file.getAbsolutePath();
Path keyPath = Paths.get(absolutePath);
BigQuery bigquery = BigQueryOptions.newBuilder()
.setCredentials(
ServiceAccountCredentials.fromStream(new FileInputStream(keyPath.toFile()))
).build().getService();
QueryJobConfiguration queryConfig = QueryJobConfiguration.newBuilder(query).build();
TableResult results = bigquery.query(queryConfig);
results
.iterateAll()
.forEach(row -> row.forEach(val -> System.out.printf("%s,", val.toString())));
System.out.println("Query performed successfully.");
} catch (BigQueryException | InterruptedException | IllegalArgumentException | IOException e) {
System.out.println("Query not performed \n" + e.toString());
}
}
}