BigQuery에서 파티셔닝 및 클러스터링

1. 소개

BigQuery는 페타바이트 규모의 저비용 완전 관리형 분석용 데이터 웨어하우스입니다. BigQuery는 서버리스입니다. 클러스터를 설정하고 관리할 필요가 없습니다.

BigQuery 데이터 세트는 GCP 프로젝트에 있으며 하나 이상의 테이블을 포함합니다. SQL을 사용하여 이러한 데이터 세트를 쿼리할 수 있습니다.

이 Codelab에서는 GCP Console의 BigQuery 웹 UI를 사용하여 BigQuery의 파티션 나누기 및 클러스터링을 이해합니다. BigQuery의 테이블 파티션 나누기와 클러스터링은 일반적인 데이터 액세스 패턴과 일치하도록 데이터를 구조화하는 데 도움이 됩니다. 파티션 나누기 및 클러스터링은 특정 데이터 범위에 대해 쿼리할 때 BigQuery 성능과 비용을 최대한 최대화하는 데 핵심적인 요소입니다. 이렇게 하면 쿼리당 스캔되는 데이터가 줄어들고 쿼리 시작 시간 전에 프루닝이 결정됩니다.

BigQuery에 대한 자세한 내용은 BigQuery 문서를 참조하세요.

학습할 내용

  • 파티션을 나누고 클러스터링된 테이블을 만들고 쿼리하는 방법
  • 파티션을 나누고 클러스터링된 테이블과 쿼리 성능 비교

필요한 항목

이 실습을 완료하려면 다음을 준비해야 합니다.

  • 최신 버전의 Chrome
  • Google Cloud Platform 결제 계정

2. 설정

BigQuery로 작업하려면 GCP 프로젝트를 만들거나 기존 프로젝트를 선택해야 합니다.

프로젝트 만들기

새 프로젝트를 만들려면 다음 단계를 따르세요.

  1. 아직 Google 계정 (Gmail 또는 Google Apps)이 없다면 계정을 만듭니다.
  2. Google Cloud Platform 콘솔 ( console.cloud.google.com)에 로그인하여 새 프로젝트를 만듭니다.
  3. 프로젝트가 없으면 프로젝트 만들기 버튼을 클릭합니다.

870a3cbd6541ee86.png

그렇지 않으면 프로젝트 선택 메뉴에서 새 프로젝트를 만듭니다.

f6dff3437a20cf2.png

  1. 프로젝트 이름을 입력하고 만들기를 선택합니다. 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유한 이름입니다.

1884405a64ce5765.png

3. 공개 데이터 세트 작업

BigQuery를 사용하면 BBC News, GitHub 저장소, Stack Overflow, 미국 국립해양기상청 (NOAA) 데이터 세트를 포함한 공개 데이터 세트로 작업할 수 있습니다. 이러한 데이터 세트를 BigQuery에 로드할 필요는 없습니다. BigQuery에서 데이터 세트를 열어 탐색하고 쿼리하기만 하면 됩니다. 이 Codelab에서는 Stack Overflow 공개 데이터 세트를 사용합니다.

Stack Overflow 데이터 세트 둘러보기

Stack Overflow 데이터 세트에는 게시물, 태그, 배지, 댓글, 사용자 등에 대한 정보가 포함되어 있습니다. BigQuery 웹 UI에서 Stack Overflow 데이터 세트를 둘러보려면 다음 단계를 따르세요.

  1. Stack Overflow 데이터 세트를 엽니다. GCP Console에서 BigQuery 웹 UI가 열리고 Stackoverflow 데이터 세트에 대한 정보가 표시됩니다.
  2. 탐색 패널에서 bigquery-public-data를 선택합니다. 메뉴가 펼쳐지면 공개 데이터 세트가 나열됩니다. 각 데이터 세트는 하나 이상의 테이블로 구성됩니다.
  3. 아래로 스크롤하여 stackoverflow를 선택합니다. 메뉴가 펼쳐지고 Stack Overflow 데이터 세트의 테이블이 나열됩니다.
  4. 배지를 선택하여 배지 테이블의 스키마를 확인하세요. 표의 필드 이름을 확인합니다.
  5. 필드 이름 위에서 미리보기를 클릭하여 배지 표의 샘플 데이터를 확인합니다.

BigQuery에서 제공되는 모든 공개 데이터 세트에 대한 자세한 내용은 Google BigQuery 공개 데이터 세트를 참조하세요.

Stackoverflow 데이터 세트 쿼리

데이터 세트 탐색은 작업 중인 데이터를 이해하는 좋은 방법이지만, 데이터 세트 쿼리는 BigQuery의 진가를 보여줍니다. 이 섹션에서는 BigQuery 쿼리를 실행하는 방법을 설명합니다. 이 시점에서 SQL을 알 필요는 없습니다. 아래 쿼리를 복사하여 붙여넣을 수 있습니다.

쿼리를 실행하려면 다음 단계를 완료하세요.

  1. GCP 콘솔의 오른쪽 상단에서 새 쿼리 작성을 선택합니다.
  2. 쿼리 편집기 텍스트 영역에 다음 SQL 쿼리를 복사하여 붙여넣습니다. BigQuery가 쿼리를 검증하면 웹 UI에서 텍스트 영역 아래에 구문이 유효함을 나타내는 녹색 체크표시가 표시됩니다.
SELECT
  EXTRACT(YEAR FROM creation_date) AS creation_year,
  COUNT(*) AS total_posts
FROM `bigquery-public-data.stackoverflow.posts_questions`
GROUP BY creation_year
ORDER BY total_posts DESC
LIMIT 10
  1. Run(실행)을 선택합니다. 쿼리는 매년 게시된 Stack Overflow 게시물 또는 질문 수를 반환합니다.

4. 새 테이블 만들기

이전 섹션에서는 BigQuery를 통해 제공되는 공개 데이터 세트를 쿼리했습니다. 이 섹션에서는 기존 테이블로부터 BigQuery에 새 테이블을 만듭니다. Stack Overflow 공개 데이터 세트 posts_questions 테이블에서 샘플링된 데이터로 새 테이블을 만든 다음 테이블을 쿼리합니다.

새 데이터 세트 만들기

테이블 데이터를 만들고 BigQuery에 로드하려면 먼저 다음 단계를 완료하여 데이터를 저장할 BigQuery 데이터 세트를 만듭니다.

  1. GCP 콘솔 탐색 패널에서 설정의 일부로 생성된 프로젝트 이름을 선택합니다.
  2. 오른쪽의 세부정보 패널에서 데이터 세트 만들기를 선택합니다.

acc6378c49622323.png

  1. 데이터 세트 만들기 대화상자에서 데이터 세트 IDstackoverflow를 입력합니다. 다른 기본 설정은 모두 그대로 두고 확인을 클릭합니다.

7a2dfd8bcb8f259a.png

2018 StackOverflow 게시물이 포함된 새 테이블 만들기

이제 BigQuery 데이터 세트를 만들었으므로 BigQuery에서 새 테이블을 만들 수 있습니다. 기존 테이블의 데이터로 테이블을 만들려면 다음 단계를 완료하여 2018 Stack Overflow 게시물 데이터 세트를 쿼리하고 결과를 새 테이블에 씁니다.

  1. GCP 콘솔의 오른쪽 상단에서 새 쿼리 작성을 선택합니다.

9ca55f544e8da8bd.png

  1. 쿼리 편집기 텍스트 영역에서 다음 SQL 쿼리를 복사하여 붙여넣어 새 테이블(DDL 문)을 만듭니다.
CREATE OR REPLACE TABLE `stackoverflow.questions_2018` AS
SELECT id, title, accepted_answer_id, creation_date, answer_count , comment_count , favorite_count, view_count, tags
FROM `bigquery-public-data.stackoverflow.posts_questions`
WHERE creation_date BETWEEN '2018-01-01' AND '2019-01-01';
  1. Run(실행)을 선택합니다. 쿼리는 BigQuery Stack Overflow 데이터 세트 bigquery-public-data.stackoverflow.posts_questions에서 쿼리를 실행하여 얻은 데이터로 프로젝트의 stackoverflow 데이터 세트에 새 questions_2018 테이블을 만듭니다.

2018 Stack Overflow 게시물이 포함된 새 테이블 쿼리

BigQuery 테이블을 만들었으므로 이제 질문 및 제목과 함께 답변 수, 댓글, 뷰, 즐겨찾기와 같은 몇 가지 기타 통계와 함께 Stack Overflow 게시물을 반환하는 쿼리를 실행해 보겠습니다. 다음 단계를 완료합니다.

  1. GCP 콘솔의 오른쪽 상단에서 새 쿼리 작성을 선택합니다.
  2. 쿼리 편집기 텍스트 영역에 다음 SQL 쿼리를 복사하여 붙여넣습니다.
SELECT id, title, accepted_answer_id, creation_date, answer_count , comment_count , favorite_count, view_count 
FROM  `stackoverflow.questions_2018` 
WHERE creation_date BETWEEN '2018-01-01' AND '2018-02-01'
AND tags = 'android';
  1. Run(실행)을 선택합니다. 이 쿼리는 2018년 1월에 생성된 Stack Overflow 질문 중 android로 태그가 지정된 질문 및 몇 가지 통계를 반환합니다.
  2. 기본적으로 BigQuery는 쿼리 결과를 캐시합니다. 동일한 쿼리를 실행하면 BigQuery가 캐시에서 결과를 반환하므로 결과를 반환하는 데 걸리는 시간이 훨씬 짧아진 것을 확인할 수 있습니다.
  3. 동일한 쿼리를 다시 실행하되 이번에는 BigQuery 캐싱을 사용 중지합니다. 파티션을 나눈 테이블과 클러스터링된 테이블과 성능 비교에서 공정한지 확인하기 위해 실습의 나머지 부분에서 캐시를 사용 중지합니다. 이 작업은 다음 섹션에서 실행합니다. 쿼리 편집기에서 더보기를 클릭하고 쿼리 설정을 선택합니다. <ph type="x-smartling-placeholder">쿼리 설정</ph>
  4. 캐시 환경설정에서 캐시 처리된 결과 사용을 선택 해제합니다. <ph type="x-smartling-placeholder">캐시 처리된 결과 옵션</ph>
  5. 쿼리 결과에서 쿼리가 완료되는 데 걸린 시간과 결과를 얻기 위해 처리된 데이터의 양이 표시됩니다.

f197b022b4276338.png

5. 파티션을 나눈 테이블 만들기 및 쿼리

이전 섹션에서는 Stack Overflow 공개 데이터 세트를 사용하여 posts_questions 테이블의 데이터로 BigQuery에 새 테이블을 만들었습니다. 캐싱이 사용 중지된 상태로 이 데이터 세트를 쿼리하고 쿼리 성능을 관찰했습니다. 이 섹션에서는 동일한 Stack Overflow 공개 데이터 세트의 posts_questions 테이블에서 새로운 파티션을 나눈 테이블을 만들고 쿼리 성능을 관찰합니다.

파티션을 나눈 테이블은 파티션이라고 하는 세그먼트로 분할된 특수한 테이블로, 데이터를 보다 쉽게 관리하고 쿼리할 수 있게 해줍니다. 일반적으로 데이터 수집 시간이나 TIMESTAMP/DATE 열 또는 INTEGER 열을 사용하여 큰 테이블을 여러 개의 작은 파티션으로 분할할 수 있습니다. DATE로 파티션을 나눈 테이블을 만듭니다.

여기에서 파티션을 나눈 테이블에 대해 자세히 알아보세요.

2018 StackOverflow 게시물이 포함된 파티션을 나눈 새 테이블 만들기

기존 테이블 또는 쿼리의 데이터로 파티션을 나눈 테이블을 만들려면 2018 Stackoverflow posts 데이터 세트를 쿼리하고 결과를 새 테이블에 써서 다음 단계를 완료하세요.

b9d0ca4df0881f58.png

  1. GCP 콘솔의 오른쪽 상단에서 새 쿼리 작성을 선택합니다.

9ca55f544e8da8bd.png

  1. 쿼리 편집기 텍스트 영역에서 다음 SQL 쿼리를 복사하여 붙여넣어 새 테이블(DDL 문)을 만듭니다.
CREATE OR REPLACE TABLE `stackoverflow.questions_2018_partitioned` 
PARTITION BY DATE(creation_date) AS
SELECT id, title, accepted_answer_id, creation_date, answer_count , comment_count , favorite_count, view_count, tags
FROM `bigquery-public-data.stackoverflow.posts_questions`
WHERE creation_date BETWEEN '2018-01-01' AND '2019-01-01';
  1. Run(실행)을 선택합니다. 쿼리는 BigQuery Stack Overflow 데이터 세트 bigquery-public-data.stackoverflow.posts_questions에서 쿼리를 실행하여 얻은 데이터로 프로젝트의 stackoverflow 데이터 세트에 새 questions_2018_partitioned 테이블을 만듭니다.

2018 Stack Overflow 게시물로 파티션을 나눈 테이블 쿼리

BigQuery 파티션을 나눈 테이블을 만들었으므로 이번에는 파티션을 나눈 테이블에서 동일한 쿼리를 실행하여 질문과 제목이 포함된 Stack Overflow 게시물과 답변 수, 댓글, 뷰, 즐겨찾기와 같은 몇 가지 기타 통계를 반환해 보겠습니다. 다음 단계를 완료합니다.

  1. GCP 콘솔의 오른쪽 상단에서 새 쿼리 작성을 선택합니다.
  2. 쿼리 편집기 텍스트 영역에 다음 SQL 쿼리를 복사하여 붙여넣습니다.
SELECT id, title, accepted_answer_id, creation_date, answer_count , comment_count , favorite_count, view_count 
FROM  `stackoverflow.questions_2018_partitioned` 
WHERE creation_date BETWEEN '2018-01-01' AND '2018-02-01'
AND tags = 'android';
  1. BigQuery 캐싱이 사용 중지된 상태로 실행을 선택합니다 (BigQuery 캐시를 사용 중지하는 방법은 이전 섹션 참고). 이 쿼리는 2018년 1월에 생성된 Stack Overflow 질문 중 android로 태그가 지정된 질문 및 몇 가지 통계를 반환합니다.
  2. 쿼리 결과에서 쿼리가 완료되는 데 걸린 시간과 결과를 얻기 위해 처리된 데이터의 양이 표시됩니다.

ef01144374069823.png

BigQuery는 파티션을 프루닝합니다. 즉, 필요한 파티션만 검색하므로 데이터가 덜 처리되고 더 빠르게 실행되므로 파티션을 나눈 테이블이 있는 쿼리 성능이 파티션을 나누지 않은 테이블보다 성능이 더 우수합니다. 이렇게 하면 쿼리 비용과 쿼리 성능이 최적화됩니다.

6. 클러스터링된 테이블 만들기 및 쿼리

이전 섹션에서는 Stack Overflow 공개 데이터 세트의 posts_questions 테이블의 데이터를 사용하여 BigQuery에 파티션을 나눈 테이블을 만들었습니다. 캐싱을 사용 중지한 상태에서 이 테이블을 쿼리했으며 파티션을 나누지 않은 테이블과 파티션을 나눈 테이블 모두에서 쿼리 성능을 관찰했습니다. 이 섹션에서는 동일한 Stack Overflow 공개 데이터 세트의 posts_questions 테이블에서 새 클러스터링된 테이블을 만들고 쿼리 성능을 관찰합니다.

BigQuery에서 테이블이 클러스터링되면 테이블 데이터는 테이블 스키마에 있는 하나 이상의 열에 있는 콘텐츠를 기준으로 자동 구성됩니다. 지정한 열은 관련 데이터를 같은 위치에 배치하는 데 사용됩니다. 데이터가 클러스터링된 테이블에 기록되면 BigQuery는 클러스터링 열의 값을 사용하여 데이터를 정렬합니다. 이러한 값은 BigQuery 스토리지의 여러 블록에 데이터를 정리하는 데 사용됩니다. 클러스터링된 열의 순서에 따라 데이터의 정렬 순서가 결정됩니다. 테이블이나 특정 파티션에 새 데이터가 추가되면 BigQuery는 백그라운드에서 자동 재클러스터링을 수행하여 테이블 또는 파티션의 정렬 속성을 복원합니다.

클러스터링된 테이블 작업에 대한 자세한 내용은 여기를 참조하세요.

2018년 Stack Overflow 게시물이 포함된 새 클러스터링된 테이블 만들기

이 섹션에서는 쿼리 액세스 패턴을 기반으로 creation_date로 파티션을 나누고 tags 열에서 클러스터링된 새 테이블을 만듭니다. 기존 테이블 또는 쿼리의 데이터로 클러스터링된 테이블을 만들려면 다음 단계를 완료하여 2018 Stack Overflow 게시물 테이블을 쿼리하고 결과를 새 테이블에 씁니다.

e7d9acc0dc3b9d79.png

  1. GCP 콘솔의 오른쪽 상단에서 새 쿼리 작성을 선택합니다.

9ca55f544e8da8bd.png

  1. 쿼리 편집기 텍스트 영역에서 다음 SQL 쿼리를 복사하여 붙여넣어 새 테이블(DDL 문)을 만듭니다.
#standardSQL
CREATE OR REPLACE TABLE `stackoverflow.questions_2018_clustered`
PARTITION BY
  DATE(creation_date)
CLUSTER BY
  tags AS
SELECT
  id, title, accepted_answer_id, creation_date, answer_count , comment_count , favorite_count, view_count, tags
FROM
  `bigquery-public-data.stackoverflow.posts_questions`
WHERE
  creation_date BETWEEN '2018-01-01' AND '2019-01-01';
  1. 실행을 선택합니다. 쿼리는 BigQuery Stack Overflow 테이블에서 쿼리를 실행하여 얻은 데이터로 프로젝트의 stackoverflow 데이터 세트에 새 questions_2018_clustered 테이블을 만듭니다bigquery-public-data.stackoverflow.posts_questions. 새 테이블은 create_date에 파티션이 나뉘고 태그 열을 기준으로 클러스터링됩니다.

2018 Stack Overflow 게시물로 클러스터링된 테이블 쿼리

BigQuery 클러스터링된 테이블을 만들었으므로 이번에는 파티션을 나누고 클러스터링된 테이블에서 동일한 쿼리를 다시 실행하여 질문 및 제목과 함께 답변 수, 댓글, 뷰, 즐겨찾기와 같은 몇 가지 기타 통계와 함께 Stack Overflow 게시물을 반환해 보겠습니다. 다음 단계를 완료합니다.

  1. GCP 콘솔의 오른쪽 상단에서 새 쿼리 작성을 선택합니다.
  2. 쿼리 편집기 텍스트 영역에 다음 SQL 쿼리를 복사하여 붙여넣습니다.
SELECT id, title, accepted_answer_id, creation_date, answer_count , comment_count , favorite_count, view_count 
FROM  `stackoverflow.questions_2018_clustered` 
WHERE creation_date BETWEEN '2018-01-01' AND '2018-02-01'
AND tags = 'android';
  1. BigQuery 캐싱이 사용 중지된 상태로 실행을 선택합니다 (BigQuery 캐시를 사용 중지하는 방법은 이전 섹션 참고). 이 쿼리는 2018년 1월에 생성된 Stack Overflow 질문 중 android로 태그가 지정된 질문 및 몇 가지 통계를 반환합니다.
  2. 쿼리 결과에서 쿼리가 완료되는 데 걸린 시간과 결과를 얻기 위해 처리된 데이터의 양이 표시됩니다.

85e3c30d6fb3d547.png

파티션을 나누고 클러스터링된 테이블을 사용하면 쿼리가 파티션을 나눈 테이블이나 파티션을 나누지 않은 테이블보다 적은 데이터를 스캔합니다. 파티셔닝 및 클러스터링으로 데이터를 구성하는 방식은 슬롯 작업자가 스캔하는 데이터의 양을 최소화하여 쿼리 성능을 개선하고 비용을 최적화합니다.

7. 삭제

스택 오버플로 데이터 세트로 계속 작업하지 않는 한, 데이터 세트를 삭제하고 이 Codelab용으로 만든 프로젝트를 삭제해야 합니다.

BigQuery 데이터 세트 삭제

BigQuery 데이터 세트를 삭제하려면 다음 단계를 따르세요.

  1. BigQuery의 왼쪽 탐색 패널에서 stackoverflow 데이터 세트를 선택합니다 .
  2. 세부정보 패널에서 데이터 세트 삭제를 선택합니다. <ph type="x-smartling-placeholder">67b0f5cb740cb2ec.png</ph>
  3. 데이터 세트 삭제 대화상자에서 stackoverflow를 입력하고 삭제를 선택하여 데이터 세트 삭제를 확인합니다.

프로젝트 삭제

이 Codelab용으로 만든 GCP 프로젝트를 삭제하려면 다음 단계를 따르세요.

  1. GCP 탐색 메뉴에서 IAM 및 관리자를 선택합니다.
  2. 탐색 패널에서 설정을 선택합니다.
  3. 세부정보 패널에서 현재 프로젝트가 이 Codelab을 위해 만든 프로젝트인지 확인하고 종료를 선택합니다.
  4. 프로젝트 종료 대화상자에서 프로젝트의 프로젝트 ID (프로젝트 이름 아님)를 입력하고 종료를 선택하여 확인합니다.

축하합니다. 지금까지 배운 내용을

  • BigQuery 웹 UI를 사용하여 기존 테이블에서 새 테이블을 만드는 방법
  • 파티션을 나누고 클러스터링된 테이블을 만들고 쿼리하는 방법
  • 파티셔닝 및 클러스터링으로 쿼리 성능 및 비용을 최적화하는 방법

데이터세트를 사용하기 위해 클러스터를 설정하거나 관리할 필요가 없었습니다.