BigQuery 다루기

BigQuery는 데이터 형식, 기본 리소스, 그리고 분석으로부터 주의를 분산시키는 기타 요소를 신경 쓸 필요 없이 대규모의 데이터세트를 저장하고 쿼리하는 문제를 해결하는 만능 도구입니다.

시작하기 전에

다음 리소스를 확인하세요.

데이터 세트

Google Cloud 프로젝트에서 BigQuery를 사용하려면 먼저 New-BqDataset cmdlet을 사용하여 Dataset을 만듭니다. 이렇게 하면 기본 정보를 가져와서 서버 측 리소스를 만듭니다. 로컬에서는 Dataset 참조 객체가 반환됩니다.

# Makes a new dataset with DatasetId "page_views".
$dataset = New-BqDataset "page_views" -Name "Page Views" `
    -Description "Page views from 2014 onwards"

기존 데이터 세트의 참조 객체를 가져오려면 Get-BqDataset을 사용합니다.

# Two ways to get a Dataset: by DatasetId and by Dataset object.
$dataset = Get-BqDataset "page_views"
$dataset = $dataset | Get-BqDataset

$dataset 객체를 수정하고 Set-BqDataset과 같은 추가 cmdlet에 전달하여 클라우드 리소스를 조작할 수 있습니다. 또한 이 cmdlet은 -SetLabel-ClearLabel을 사용하여 라벨을 추가 및 삭제할 수 있습니다.

# Updates the Name field of $dataset.
$dataset.Name = "PageView Data"
$dataset = Set-BqDataset "page_views"
# Adds the labels 'department' and 'purpose' to $dataset.
$dataset = Set-BqDataset "page_views" -SetLabel `
    @{"department" = "statistics"; "purpose" = "metrics"}

라벨은 데이터세트를 필터링하여 나중에 검색할 수 있도록 데이터세트에 키워드 또는 값으로 태그를 지정하는 데 사용됩니다. Get-BqDataset cmdlet에는 다른 cmdlet으로 처리할 수 있는 데이터 세트를 나열할 때 세밀하게 제어할 수 있도록 -Filter 플래그가 기본 제공됩니다.

# Filter Datasets by the department label.
$stats = Get-BqDataset -Filter "department:statistics"

DatasetsRemove-BqDataset cmdlet에 의해 삭제될 수 있습니다. 이 cmdlet은 ShouldProcess(-WhatIf 매개변수)을 지원하며 비어 있지 않은 Dataset을 삭제하기 전에 사용자 확인을 요청하는 메시지를 표시합니다. 이 보호 장치는 스크립트할 때 -Force 매개변수를 통해 우회될 수 있습니다.

# Deletes $dataset.
$dataset | Remove-BqDataset

Dataset에는 데이터를 보관하는 다양한 Tables가 있습니다. TableId와 테이블이 상주하는 Dataset을 전달하여 New-BqTable cmdlet을 통해 Tables가 생성됩니다. Dataset은 객체 또는 -DatasetId 매개변수를 통해 전달될 수 있습니다. Get-BqTableSet-BqTable은 위 Get-Set- 데이터 세트 cmdlet과 동일한 방식으로 작동합니다.

# Creates a new table in the dataset from above.
$table = $dataset | New-BqTable "logs2014" `
    -Description "Log data from Jan 2014 to Dec 2014 inclusive"

# Gets a reference object for "page_views:logs2014".
$table = Get-BqTable "logs2014" -DatasetId "page_views"

# Modifies the Name attribute of logs2014.
$table.Name = "Logs 2014"
$table = $table | Set-BqTable

TablesRemove-BqTable cmdlet에 의해 삭제될 수 있습니다. 이 cmdlet은 ShouldProcess(-WhatIf 매개변수)를 지원하며 데이터가 포함된 Table을 삭제하기 전에 사용자 확인을 요청하는 메시지를 표시합니다. 이 보호 장치는 -Force 매개변수를 통해 우회될 수 있습니다.

# Deletes $table.
$table | Remove-BqTable -Force

스키마

Tables가 포함된 데이터 형식을 설명하려면 Schemas가 필요합니다. 스키마는 New-BqSchemaSet-BqSchema cmdlet을 통해 생성됩니다. New-BqSchema는 행의 형식을 매개변수로 직접 또는 행 설명의 JSON 배열로 사용할 수 있습니다. New-BqSchema 결과는 항상 Set-BqSchema로 전달되므로 Schema 객체를 출력하거나 스키마를 기존 Table에 할당할 수 있습니다.

# Assigns a Schema to $table
$table = Get-BqTable "logs2014" -DatasetId "page_views"
New-BqSchema "Page" "STRING" | New-BqSchema "Referrer" "STRING" |
    New-BqSchema "Timestamp" "DATETIME" | Set-BqSchema $table

# Creates a schema object to be used in multiple tables.
$schema = New-BqSchema "Page" "STRING" | New-BqSchema "Referrer" "STRING" |
    New-BqSchema "Timestamp" "DATETIME" | Set-BqSchema

Schema 객체가 미리 생성되어 있으면 Table 만들기 매개변수로 전달될 수 있습니다.

# Creates a new table with the Schema object from above.
$table = $dataset | New-BqTable "logs2014" -Schema $schema

TableRow

Tables에서 데이터가 추가 및 삭제됩니다. Add-BqTableRowGet-BqTableRow cmdlet을 사용하면 이러한 행에 액세스할 수 있습니다. Add-BqTableRow는 CSV, JSON, AVRO 파일을 BigQuery로 가져옵니다.

# Ingests a CSV file and appends its rows onto the table 'my_dataset:my_table'.
$table = New-BqTable "logs2014" -DatasetId "page_views"
$table | Add-BqTableRow CSV $filename -SkipLeadingRows 1 `
                                      -WriteMode WriteAppend

# Returns a list of the rows in 'page_views:logs2014'.
$list = Get-BqTable "logs2014" -DatasetID "page_views" | Get-BqTableRow

작업

Jobs에는 쿼리, 로드, 추출, 복사 등 네 가지 유형이 있습니다. 쿼리 작업은 SQL 스타일 쿼리를 실행하고 결과를 테이블로 출력합니다.

# Query Job: starts a query and outputs results into $table.
Start-BqJob -Query "SELECT * FROM ``page_views:logs2014``" `
            -Destination $table

Load(로드) 작업은 Cloud Storage 파일을 BigQuery로 가져옵니다.

# Load Job: adds TableRows to $table from the file specified
# on Cloud Storage.
$job = $dest_table | Start-BqJob `
    -Load CSV "gs://page_views/server_logs_raw_2014.csv"

Extract(추출) 작업은 BigQuery 테이블을 Cloud Storage로 내보냅니다.

# Extract Job: exports $src_table to a Cloud Storage file.
$job = $src_table | Start-BqJob `
    -Extract CSV "gs://page_views/logs2014.csv"

Copy(복사) 작업은 기존 테이블을 새로운 테이블 또는 다른 기존 테이블로 복사합니다.

# Copy Job: Starts a copy job, cancels it, and polls until the job is completely done.
$job = $table | Start-BqJob -Copy $dest_table
$result = $job | Stop-BqJob
while ($result.Status.State -ne "DONE") {
    $result = $result | Get-BqJob
}

Start-BqJob은 이러한 종류의 작업을 비동기 작업으로 시작합니다. 작업이 완료될 때까지 -PollUntilComplete 플래그를 사용하여 cmdlet을 차단합니다. Receive-BqJob은 쿼리 작업이 완료되면 결과를 반환합니다. Get-BqJob은 작업의 현재 상태와 통계를 자세히 설명하는 참조 객체를 반환합니다. Stop-BqJob은 서버에 특정 작업을 중지하라는 요청을 보낸 후 즉시 반환합니다.

쿼리 문자열 내의 테이블 이름 형식에 대한 참고: BigQuery 형식은 테이블 이름을 역따옴표로 묶어야 한다고 지정하지만 역따옴표는 PowerShell의 이스케이프 연산자이기도 합니다. 이 때문에 역따옴표는 두 번째 역따옴표를 추가하여 이스케이프 처리해야 합니다. 예시는 쿼리 작업 샘플 코드를 참조하세요.