빅쿼리 Streaming Insert - go lang 샘플

최유석

기본준비사항

프로젝트 과금 설정(https://support.google.com/cloud/answer/6293499#enable-billing), 

빅쿼리 API활성화(https://console.cloud.google.com/flows/enableapi?apiid=bigquery&_ga=1.216323729.601314171.1492654432),

Cloud SDK 설치(https://cloud.google.com/sdk/downloads),

Client Libraries 설치 및 OAuth2.0 인증(로컬환경 실행 시) (https://cloud.google.com/bigquery/docs/reference/libraries#client-libraries-install-go),

Service account(또는 default service account사용)Key 생성이 되어있으며 Key 파일이 OS환경변수로 GOOGLE_APPLICATION_CREDENTIALS 지정 되어있다고 가정한다.( https://cloud.google.com/docs/authentication)

 

또한 go lang(https://golang.org/)설치 및 기본 설정은 되어있다고 가정한다.

여기서는 go 1.8버전을 기준으로 테스트하였다.

 

테이블 생성

빅쿼리에 "gotest"라는 데이터 셋을 생성하고 해당 데이터셋에 "gotable"이라는 이름으로 테이블을 생성한다. 생성할 테이블의 스키마정보는 다음과 같다.

Name:STRING,Count:INTEGER

생성된 테이블 정보

 

빅쿼리 Streaming Insert 샘플 코드 - Go lang

package main
import (
           "fmt"
           "log"
 
           "cloud.google.com/go/bigquery"
           "golang.org/x/net/context"
)
 
type Item struct {
           Name  string
           Count int
}
 
// Save implements the ValueSaver interface.
func (i *Item) Save() (map[string]bigquery.Value, string, error) {
           return map[string]bigquery.Value{
                      "Name":  i.Name,
                      "Count": i.Count,
           }, "", nil
}
 
func main() {
           ctx := context.Background()
 
           // Sets your Google Cloud Platform project ID.
           projectID := "cystest-1" //프로젝트ID
           datasetID := "gotest" //데이터셋ID
           tableID := "gotable" //테이블ID
 
           // Creates a client.
           client, err := bigquery.NewClient(ctx, projectID)
           if err != nil {
                      log.Fatalf("Failed to create client: %v", err)
           }
           insertRows(client, datasetID, tableID)    
}
 
func insertRows(client *bigquery.Client, datasetID, tableID string) error {
           ctx := context.Background()
                     
           // [START bigquery_insert_stream]
           u := client.Dataset(datasetID).Table(tableID).Uploader()
           items := []*Item{
                      // Item implements the ValueSaver interface.
                      // 아래에 테이블에 삽입할 레코드를 입력한다.
                      {Name: "n1", Count: 7},
                      {Name: "n2", Count: 2},
                      {Name: "n3", Count: 1},
           }
           if err := u.Put(ctx, items); err != nil {
                      return err
           }
           // [END bigquery_insert_stream]
           fmt.Printf("insert complete\n")
           return nil
}

 

코드 실행하기( .go파일이 위치한 폴더에서)

go run gotest.go

*빌드는 생략한다.

 

코드실행 결과 확인하기

빅쿼리에 Streaming Insert로 데이터를 적재하게되면 Streaming buffer에 먼저 기록되고 실제 테이블에 값이 저장되기까지 최대 90분까지 소요될 수 있다. 따라서 테이블의 preview로는 바로 확인 안 될 수 있으니 간단한 조회 쿼리를 실행해서 확인한다.

좌측 상단의 [COMPOSE QUERY] 버튼으로 쿼리 입력 창을 활성화하고 다음 쿼리를 입력하고 실행한다.

SELECT * FROM gotest.gotable

 

쿼리 실행결과

쿼리를 실행하면 정상적으로 테이블에 데이터가 추가된 것을 확인할 수 있다.

 

참고자료

https://cloud.google.com/bigquery/streaming-data-into-bigquery

https://godoc.org/cloud.google.com/go/bigquery

https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/bigquery/uploader.go

https://github.com/GoogleCloudPlatform/golang-samples/blob/master/bigquery/snippets/snippet.go

 

 

 

 

 

+ Recent posts