BigQuery 다루기

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

시작하기 전에

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

Dataset

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"

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

# Deletes $dataset.
$dataset | Remove-BqDataset

Table

Dataset(데이터세트)에는 데이터를 저장하기 위한 여러 개의 Tables(테이블)이 있습니다. TablesNew-BqTable cmdlet을 사용하여 TableId와 테이블이 상주하는 Dataset를 전달하여 만듭니다. Dataset는 객체 또는 -DatasetId 매개변수를 사용하여 전달할 수 있습니다. Get-BqTableSet-BqTable은 위의 Get-Set- dataset 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

Remove-BqTable cmdlet를 사용하여 Tables을 삭제할 수 있습니다. 이 cmdlet는 ShouldProcess(-WhatIf 매개변수)를 지원하고, 데이터를 포함하는 Table을 삭제하기 전에 사용자 확인을 요청하는 메시지를 표시합니다. 이 보호 장치는 -Force 매개변수를 사용하여 우회할 수 있습니다.

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

Schema

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

Job

Jobs(작업)에는 네 가지 유형, 즉 Query(쿼리), Load(로드), Extract(추출), Copy(복사)가 있습니다. Query(쿼리) 작업은 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은 이러한 유형의 작업을 비동기 작업으로 시작합니다. 작업이 완료될 때까지 cmdlet 차단을 적용하려면 -PollUntilComplete 플래그를 사용하세요. Receive-BqJob은 쿼리 작업이 완료되면 그 결과를 반환합니다. Get-BqJob은 작업의 현재 상태와 통계를 자세하게 설명하는 참조 객체를 반환합니다. Stop-BqJob은 서버에 특정 작업을 중지하라는 요청을 보낸 다음 즉시 결과를 반환합니다.

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