

# BigQuery 연결
<a name="aws-glue-programming-etl-connect-bigquery-home"></a>

AWS Glue for Spark를 사용하여 AWS Glue 4.0 이상 버전에서 Google BigQuery의 테이블에서 읽고 쓸 수 있습니다. Google SQL 쿼리를 사용하여 BigQuery에서 읽을 수 있습니다. AWS Glue 연결을 통해 AWS Secrets Manager에 저장된 보안 인증 정보를 사용하여 BigQuery에 연결합니다.

Google BigQuery에 대한 자세한 내용은 [Google Cloud BigQuery 웹사이트](https://cloud.google.com/bigquery)를 참조하세요.

## BigQuery 연결 구성
<a name="aws-glue-programming-etl-connect-bigquery-configure"></a>

AWS Glue에서 Google BigQuery에 연결하려면 AWS Secrets Manager 보안 암호에서 Google Cloud Platform 보안 인증 정보를 생성하고 저장한 다음 해당 보안 암호를 Google BigQuery AWS Glue 연결에 연결해야 합니다.

**BigQuery에 대한 연결 구성하기:**

1. Google Cloud Platform에서 관련 리소스를 생성하고 식별합니다.
   + 연결하려는 BigQuery 테이블이 포함된 GCP 프로젝트를 생성하거나 식별합니다.
   + BigQuery API를 활성화합니다. 자세한 내용은 [BigQuery Storage Read API를 사용하여 테이블 데이터 읽기](https://cloud.google.com/bigquery/docs/reference/storage/#enabling_the_api)를 참조하세요.

1. Google Cloud Platform에서 서비스 계정 보안 인증 정보를 생성하고 내보냅니다.

   BigQuery 보안 인증 마법사를 사용하여 [보안 인증 정보 생성하기](https://console.cloud.google.com/apis/credentials/wizard?api=bigquery.googleapis.com) 단계를 신속하게 처리할 수 있습니다.

   GCP에서 서비스 계정을 생성하려면 [서비스 계정 생성하기](https://cloud.google.com/iam/docs/service-accounts-create)에서 제공되는 튜토리얼을 따르세요.
   + **프로젝트**를 선택할 때 BigQuery 테이블이 포함된 프로젝트를 선택합니다.
   + 서비스 계정의 GCP IAM 역할을 선택할 때 BigQuery 작업을 실행하여 BigQuery 테이블을 읽고, 쓰고, 생성할 수 있는 적절한 권한을 부여하는 역할을 추가하거나 생성하세요.

   서비스 계정의 보안 인증 정보를 생성하려면 [서비스 계정 키 생성하기](https://cloud.google.com/iam/docs/keys-create-delete#creating)에서 제공되는 튜토리얼을 따르세요.
   + 키 유형을 선택할 때 **JSON**을 선택합니다.

   이제 서비스 계정의 보안 인증 정보가 포함된 JSON 파일을 다운로드했어야 합니다. 예를 들면 다음과 같아야 합니다.

   ```
   {
     "type": "service_account",
     "project_id": "*****",
     "private_key_id": "*****",
     "private_key": "*****",
     "client_email": "*****",
     "client_id": "*****",
     "auth_uri": "https://accounts.google.com/o/oauth2/auth",
     "token_uri": "https://oauth2.googleapis.com/token",
     "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
     "client_x509_cert_url": "*****",
     "universe_domain": "googleapis.com"
   }
   ```

1. 보안 인증 JSON 파일을 적절하게 안전한 Amazon S3 위치에 업로드합니다. 향후 단계를 위해 파일 경로인 *s3secretpath*를 유지합니다.

1. AWS Secrets Manager에서 Google Cloud Platform 보안 인증 정보를 사용하여 보안 암호를 생성합니다. Secrets Manager에서 보안 암호를 생성하려면 AWS Secrets Manager 설명서의 [Create an AWS Secrets Manager secret](https://docs.aws.amazon.com//secretsmanager/latest/userguide/create_secret.html)에서 제공하는 자습서를 따릅니다. 보안 암호를 생성한 후에는 다음 단계를 위해 보안 암호 이름, *secretName*을 유지합니다.

   키/값 페어를 생성할 때 키와 값을 다음과 같이 지정합니다.
   + `token_uri`, `client_x509_cert_url`, `private_key_id`, `project_id`, `universe_domain`, `auth_provider_x509_cert_url`, `auth_uri`, `client_email`, `private_key`, `type`, `client_id` 키의 경우 다운로드한 JSON 파일에서 해당되는 값을 지정합니다.
   + `spark.hadoop.google.cloud.auth.service.account.json.keyfile` 키의 경우 *s3secretpath*를 지정합니다.

1. AWS Glue 데이터 카탈로그에서 [AWS Glue 연결 추가](console-connections.md)의 단계에 따라 연결을 생성합니다. 연결을 생성한 후에는 다음 단계를 위해 연결 이름, *connectionName*을 유지합니다.
   + **연결 유형**을 선택할 때 Google BigQuery를 선택합니다.
   + **AWS 보안 암호**를 선택할 때 *secretName*을 입력합니다.

1. AWS Glue 작업과 연결된 IAM 역할에 *secretName*을 읽을 수 있는 권한을 부여합니다.

1. AWS Glue 작업 구성에서 **추가 네트워크 연결**로 *connectionName*을 제공합니다.

## BigQuery 테이블에서 읽기
<a name="aws-glue-programming-etl-connect-bigquery-read"></a>

**사전 조건 ** 
+ 읽으려는 BigQuery 테이블. 양식 `[dataset].[table]`에 있는 BigQuery 테이블 및 데이터 세트 이름이 필요합니다. 이 *tableName*이라고 부르겠습니다.
+ BigQuery 테이블의 청구 프로젝트. 프로젝트 이름인 *parentProject*가 필요합니다. 결제 상위 프로젝트가 없는 경우 테이블이 포함된 프로젝트를 사용합니다.
+ BigQuery 인증 정보. *AWS Glue로 연결 자격 증명 관리* 단계를 완료하여 인증 정보를 구성합니다. AWS Glue 연결의 이름인 *connectionName*이 필요합니다.

예: 

```
bigquery_read = glueContext.create_dynamic_frame.from_options(
    connection_type="bigquery",
    connection_options={
        "connectionName": "connectionName",
        "parentProject": "parentProject",
        "sourceType": "table",
        "table": "tableName",
    }
```

DynamicFrame에 반환되는 결과를 필터링하는 쿼리를 제공할 수도 있습니다. `query`, `sourceType`, `viewsEnabled` 및 `materializationDataset`을(를) 구성해야 합니다.

예:

**추가 사전 조건:**

BigQuery가 쿼리에 대한 구체화된 뷰를 작성할 수 있는 BigQuery 데이터 세트인 *materializationDataset*를 생서하거나 식별해야 합니다.

*materializationDataset*에서 테이블을 생성하려면 서비스 계정에 적절한 GCP IAM 권한을 부여해야 합니다.

```
glueContext.create_dynamic_frame.from_options(
            connection_type="bigquery",
            connection_options={
                "connectionName": "connectionName",
                "materializationDataset": materializationDataset,
                "parentProject": "parentProject",
                "viewsEnabled": "true",
                "sourceType": "query",
                "query": "select * from bqtest.test"
            }
        )
```

## BigQuery 테이블에 쓰기
<a name="aws-glue-programming-etl-connect-bigquery-write"></a>

이 예시는 BigQuery 서비스에 직접 작성합니다. BigQuery는 '간접' 쓰기 메서드도 지원합니다. 간접 쓰기 구성에 대한 자세한 내용은 [Google BigQuery를 통한 간접 쓰기 사용](#aws-glue-programming-etl-connect-bigquery-indirect-write)을(를) 참조하세요.

**사전 조건 ** 
+ 쓰려는 BigQuery 테이블. 양식 `[dataset].[table]`에 있는 BigQuery 테이블 및 데이터 세트 이름이 필요합니다. 자동으로 생성되는 새 테이블 이름을 제공할 수도 있습니다. 이 *tableName*이라고 부르겠습니다.
+ BigQuery 테이블의 청구 프로젝트. 프로젝트 이름인 *parentProject*가 필요합니다. 결제 상위 프로젝트가 없는 경우 테이블이 포함된 프로젝트를 사용합니다.
+ BigQuery 인증 정보. *AWS Glue로 연결 자격 증명 관리* 단계를 완료하여 인증 정보를 구성합니다. AWS Glue 연결의 이름인 *connectionName*이 필요합니다.

예: 

```
bigquery_write = glueContext.write_dynamic_frame.from_options(
    frame=frameToWrite,
    connection_type="bigquery",
    connection_options={
        "connectionName": "connectionName",
        "parentProject": "parentProject",
        "writeMethod": "direct",
        "table": "tableName",
    }
)
```

## BigQuery연결 옵션 참조
<a name="aws-glue-programming-etl-connect-bigquery-reference"></a>
+ `project`— 기본값: Google Cloud 서비스 계정 기본값. 읽기 및 쓰기에 사용됩니다. 테이블과 연결된 Google Cloud 프로젝트의 이름.
+ `table` -- (필수) 읽기 및 쓰기에 사용됩니다. `[[project:]dataset.]` 형식에 따른 BigQuery 테이블의 이름.
+ `dataset`— `table` 옵션을 통해 정의되지 않은 경우 필수입니다. 읽기 및 쓰기에 사용됩니다. BigQuery 테이블을 포함하는 데이터 세트의 이름.
+ `parentProject`— 기본값: Google Cloud 서비스 계정 기본값. 읽기 및 쓰기에 사용됩니다. 청구에 사용되는 `project`와(과) 연결된 Google Cloud 프로젝트의 이름.
+ `sourceType` — 읽기에 사용됩니다. 읽을 때 필요합니다. 유효한 값:`table`, `query`은(는) 테이블로 읽을 것인지 쿼리로 읽을 것인지 AWS Glue에 알립니다.
+ `materializationDataset` — 읽기에 사용됩니다. 유효한 값: 문자열. 보기의 구체화를 저장하는 데 사용되는 BigQuery 데이터 세트의 이름.
+ `viewsEnabled` — 읽기에 사용됩니다. 기본값: false. 유효한 값: 참, 거짓. BigQuery에서 보기를 사용할지 여부를 구성합니다.
+ `query` — 읽기에 사용됩니다. `viewsEnabled`이(가) 참일 때 사용됩니다. GoogleSQL DQL 쿼리.
+ `temporaryGcsBucket`— 쓰기에 사용됩니다. `writeMethod`이(가) 기본값(`indirect`)으로 설정된 경우에 필요합니다. BigQuery에 쓰는 동안 중간 형식의 데이터를 저장하는 데 사용되는 Google Cloud Storage 버킷의 이름.
+ `writeMethod` - 기본값: `indirect`. 유효한 값: `direct`, `indirect`. 쓰기에 사용됩니다. 데이터를 쓰는 데 사용되는 메서드를 지정합니다.
  + `direct`(으)로 설정하면 커넥터가 BigQuery Storage 쓰기 API를 사용하여 데이터를 작성합니다.
  + `indirect`(으)로 설정하면 커넥터가 Google Cloud Storage에 쓴 다음 로드 작업을 사용하여 BigQuery로 전송합니다. Google Cloud 서비스 계정에는 적절한 GCS 권한이 필요합니다.

## Google BigQuery를 통한 간접 쓰기 사용
<a name="aws-glue-programming-etl-connect-bigquery-indirect-write"></a>

이 예시에서는 Google Cloud Storage에 데이터를 쓰고 Google BigQuery에 데이터를 복사하는 간접 쓰기를 사용합니다.

**사전 조건 **

임시 Google Cloud Storage 버킷인 *temporaryBucket*이 필요합니다.

AWS Glue GCP 서비스 계정의 GCP IAM 역할에는 *temporaryBucket*에 액세스하는 적절한 GCS 권한이 필요합니다.

**추가 구성:**

**BigQuery를 사용하여 간접 쓰기 구성하기:**

1. [BigQuery 연결 구성](#aws-glue-programming-etl-connect-bigquery-configure)을(를) 평가하고, GCP 보안 인증 JSON 파일을 찾거나 다시 다운로드합니다. 작업에 사용되는 Google BigQuery AWS Glue 연결의 AWS Secrets Manager 보안 암호인 *secretName*을(를) 식별합니다.

1. 보안 인증 JSON 파일을 적절하게 안전한 Amazon S3 위치에 업로드합니다. 향후 단계를 위해 파일 경로인 *s3secretpath*를 유지합니다.

1. *secretName*을(를) 편집하고 `spark.hadoop.google.cloud.auth.service.account.json.keyfile` 키를 추가합니다. 값을 *s3secretpath*에 설정합니다.

1. AWSGlue 작업 Amazon S3 IAM에 *s3secretpath*에 액세스할 수 있는 권한을 부여합니다.

이제 쓰기 메서드에 임시 GCS 버킷 위치를 제공할 수 있습니다. `indirect`은(는) 이전에는 기본값이었기 때문에 `writeMethod`을(를) 제공하지 않아도 됩니다.

```
bigquery_write = glueContext.write_dynamic_frame.from_options(
    frame=frameToWrite,
    connection_type="bigquery",
    connection_options={
        "connectionName": "connectionName",
        "parentProject": "parentProject",
        "temporaryGcsBucket": "temporaryBucket",
        "table": "tableName",
    }
)
```