connect GCP Bigquery with java spring

x·2023년 1월 17일
0

spring

목록 보기
1/3

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());
        }
    }
}

0개의 댓글