BigQuery용 bq 명령줄 도구로 데이터 로드 및 쿼리

1. 소개

BigQuery는 Google의 완전 관리형, NoOps(무인 운영), 저비용 분석 데이터베이스입니다. BigQuery를 사용하면 데이터베이스 관리자나 인프라 없이도 테라바이트 규모의 데이터를 쿼리할 수 있습니다. BigQuery는 익숙한 SQL과 사용한 만큼만 지불하는 요금 청구 모델을 사용합니다. BigQuery는 데이터를 분석하여 의미 있고 유용한 정보를 찾는 데 집중할 수 있게 해줍니다. 이 Codelab에서는 bq 명령줄 도구를 사용하여 로컬 CSV 파일을 새 BigQuery 테이블에 로드합니다.

학습할 내용

  • BigQuery용 bq 명령줄 도구 사용 방법
  • 로컬 데이터 파일을 BigQuery 테이블에 로드하는 방법

필요한 항목

  • Google Cloud 프로젝트
  • 브라우저(예: Chrome)

2. 설정

BigQuery 사용 설정

아직 Google 계정이 없다면 계정을 만들어야 합니다.

  1. Google Cloud 콘솔에 로그인하고 BigQuery로 이동합니다. 또한 브라우저에 다음 URL을 입력하여 BigQuery 웹 UI를 직접 열 수도 있습니다.
https://console.cloud.google.com/bigquery
  1. 서비스 약관에 동의합니다.
  2. BigQuery를 사용하려면 먼저 프로젝트를 만들어야 합니다. 프롬프트에 따라 새 프로젝트를 만듭니다.

프로젝트 이름을 선택하고 프로젝트 ID를 기록해 둡니다. 1884405a64ce5765.png

프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유한 이름입니다. 이 ID는 나중에 이 Codelab에서 PROJECT_ID라고 부릅니다.

이 Codelab에서는 BigQuery 샌드박스 한도와 함께 BigQuery 리소스를 사용합니다. 결제 계정은 필요하지 않습니다. 나중에 샌드박스 한도를 없애려면 Google Cloud 무료 체험판에 가입하여 결제 계정을 추가하면 됩니다.

Cloud Shell

Google Cloud에서 실행되는 명령줄 환경인 Cloud Shell을 사용합니다.

Cloud Shell 활성화

  1. Cloud Console에서 Cloud Shell 활성화4292cbf4971c9786.png를 클릭합니다.

bce75f34b2c53987.png

이전에 Cloud Shell을 시작한 적이 없는 경우 기능을 설명하는 중간 화면 (스크롤해야 볼 수 있는 부분)이 표시됩니다. 이 경우 계속을 클릭합니다 (다시 표시되지 않음). 이 일회성 화면은 다음과 같습니다.

70f315d7b402b476.png

Cloud Shell을 프로비저닝하고 연결하는 데 몇 분 정도만 걸립니다.

fbe3a0674c982259.png

가상 머신에는 필요한 개발 도구가 모두 들어 있습니다. 영구적인 5GB 홈 디렉터리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 Codelab에서 대부분의 작업은 브라우저나 Chromebook만 사용하여 수행할 수 있습니다.

Cloud Shell에 연결되면 인증이 완료되었고 프로젝트가 해당 프로젝트 ID로 이미 설정된 것을 볼 수 있습니다.

  1. Cloud Shell에서 다음 명령어를 실행하여 인증되었는지 확인합니다.
gcloud auth list

명령어 결과

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell에서 다음 명령어를 실행하여 gcloud 명령어가 프로젝트를 알고 있는지 확인합니다.
gcloud config list project

명령어 결과

[core]
project = <PROJECT_ID>

또는 다음 명령어로 설정할 수 있습니다.

gcloud config set project <PROJECT_ID>

명령어 결과

Updated property [core/project].

3. 데이터 세트 만들기

테이블을 포함할 데이터 세트를 만듭니다.

데이터 세트란 무엇인가요?

BigQuery 데이터 세트는 테이블의 모음입니다. 데이터 세트의 모든 테이블은 동일한 데이터 위치에 저장됩니다. 커스텀 액세스 제어를 연결하여 데이터 세트 및 해당 테이블에 대한 액세스를 제한할 수도 있습니다.

데이터 세트 만들기

Cloud Shell에서 bq mk 명령어를 사용하여 'bq_load_codelab'라는 데이터 세트를 만듭니다.

bq mk bq_load_codelab

데이터 세트 속성 보기

bq show 명령어로 데이터 세트의 속성을 확인하여 데이터 세트가 생성되었는지 확인합니다.

bq show bq_load_codelab

다음과 비슷한 출력이 표시됩니다.

Dataset my-project:bq_load_codelab

   Last modified           ACLs          Labels
 ----------------- -------------------- --------
  15 Jun 14:12:49   Owners:
                      projectOwners,
                      your-email@example.com
                    Writers:
                      projectWriters
                    Readers:
                      projectReaders

4. 데이터 파일 만들기

BigQuery는 줄바꿈으로 구분된 JSON, Avro, CSV를 비롯한 여러 데이터 형식의 데이터를 로드할 수 있습니다. 편의상 CSV를 사용합니다.

CSV 파일 만들기

Cloud Shell에서 빈 CSV 파일을 만듭니다.

touch customer_transactions.csv

cloudshell 수정 명령어를 실행하여 Cloud Shell의 코드 편집기에서 CSV 파일을 엽니다. 코드 편집기와 Cloud Shell 패널이 있는 새 브라우저 창이 열립니다.

cloudshell edit customer_transactions.csv

코드 편집기에 쉼표로 구분된 값을 입력하여 BigQuery에 로드합니다.

ID,Zipcode,Timestamp,Amount,Feedback,SKU
c123,78757,2018-02-14 17:01:39Z,1.20,4.7,he4rt5
c456,10012,2018-03-14 15:09:26Z,53.60,3.1,ppiieee
c123,78741,2018-04-01 05:59:47Z,5.98,2.0,ch0c0

파일 > 수정을 클릭합니다.

5. 데이터 로드

bq load 명령어를 사용하여 CSV 파일을 BigQuery 테이블에 로드합니다.

bq load \
    --source_format=CSV \
    --skip_leading_rows=1 \
    bq_load_codelab.customer_transactions \
    ./customer_transactions.csv \
    id:string,zip:string,ttime:timestamp,amount:numeric,fdbk:float,sku:string

다음 옵션을 사용했습니다.

  • --source_format=CSV는 데이터 파일을 파싱할 때 CSV 데이터 형식을 사용합니다.
  • --skip_leading_rows=1은 헤더 행이므로 CSV 파일의 첫 번째 줄을 건너뜁니다.
  • Bq_load_codelab.customer_transactions—the first positional argument—는 데이터를 로드해야 하는 테이블을 정의합니다.
  • ./customer_transactions.csv: 두 번째 위치 인수는 로드할 파일을 정의합니다. 로컬 파일 외에도 bq load 명령어는 gs://my_bucket/path/to/file URIs을 사용하여 Cloud Storage에서 파일을 로드할 수 있습니다.
  • 스키마는 JSON 스키마 파일 또는 쉼표로 구분된 목록으로 정의할 수 있습니다. (편의를 위해 쉼표로 구분된 목록을 사용했습니다.)

customer_transactions 테이블에서 다음 스키마를 사용했습니다.

  • Id:string: 고객 식별자입니다.
  • Zip:string: 미국 우편번호
  • Ttime:timestamp: 거래가 발생한 날짜 및 시간입니다.
  • Amount:numeric: 거래 금액 (숫자 열은 데이터를 십진수 형식으로 저장하며, 금전적 가치에 유용함)
  • Fdbk:float: 거래에 관한 의견 설문조사의 평점
  • Sku:string: 구매한 상품의 식별자입니다.

테이블 세부정보 가져오기

테이블 속성을 표시하여 테이블이 로드되었는지 확인합니다.

bq show bq_load_codelab.customer_transactions

출력:

Table my-project:bq_load_codelab.customer_transactions

   Last modified          Schema          Total Rows   Total Bytes
 ----------------- --------------------- ------------ -------------
  15 Jun 15:13:55   |- id: string         3            159
                    |- zip: string
                    |- ttime: timestamp
                    |- amount: numeric
                    |- fdbk: float
                    |- sku: string

6. 데이터 쿼리

이제 데이터가 로드되었으므로 BigQuery 웹 UI, bq 명령어 또는 API를 사용하여 데이터를 쿼리할 수 있습니다. 쿼리는 읽을 권한이 있는 모든 데이터 세트 (또는 데이터 세트가 동일한 위치에 있는 경우 데이터 세트)와 데이터를 조인할 수 있습니다.

데이터 세트를 미국 우편번호 데이터 세트와 조인하고 미국 주별로 거래를 합산하는 표준 SQL 쿼리를 실행합니다. bq 쿼리 명령어를 사용하여 쿼리를 실행합니다.

bq query --nouse_legacy_sql '
SELECT SUM(c.amount) AS amount_total, z.state_code AS state_code
FROM `bq_load_codelab.customer_transactions` c
JOIN `bigquery-public-data.utility_us.zipcode_area` z
ON c.zip = z.zipcode
GROUP BY state_code
'

이 명령어는 다음과 같이 출력됩니다.

Waiting on bqjob_r26...05a15b38_1 ... (1s) Current status: DONE   
+--------------+------------+
| amount_total | state_code |
+--------------+------------+
|         53.6 | NY         |
|         7.18 | TX         |
+--------------+------------+

실행한 쿼리는 공개 데이터 세트와 비공개 데이터 세트를 사용했습니다. 자세한 내용은 동일한 쿼리의 주석이 달린 버전을 참고하세요.

#standardSQL
SELECT
  /* Total of all transactions in the state. */
  SUM(c.amount) AS amount_total,

  /* State corresponding to the transaction's zipcode. */
  z.state_code AS state_code

/* Query the table you just constructed.
 * Note: If you omit the project from the table ID,
 *       the dataset is read from your project. */
FROM `bq_load_codelab.customer_transactions` c

/* Join the table to the zipcode public dataset. */
JOIN `bigquery-public-data.utility_us.zipcode_area` z

/* Find the state corresponding to the transaction's zipcode. */
ON c.zip = z.zipcode

/* Group over all transactions by state. */
GROUP BY state_code

7. 삭제

bq rm 명령어로 만든 데이터 세트를 삭제합니다. -r 플래그를 사용하여 해당 파일에 포함된 테이블을 삭제합니다.

bq rm -r bq_load_codelab

8. 축하합니다.

BigQuery에 테이블을 업로드하고 쿼리했습니다.

학습한 내용

  • bq 명령줄 도구를 사용하여 BigQuery와 상호작용합니다.
  • 데이터와 공개 데이터 세트를 BigQuery 쿼리와 조인

다음 단계

다음에 대해 자세히 알아보기