ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

BigQuery Data Transfer ServiceをAPIから設定する

スポンサードリンク

めっちゃハマった(3H)のでここに記す.

ドキュメントもなく辛い

手順まとめ

モジュールのinstall

$ pip install google-cloud-bigquery-datatransfer

認証ファイル

サービスアカウントでやりました。作成方法はskipします(ぐぐったらすぐ出てくるので)

import os

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = './xxx.json'

あと、IAMで「BigQuery Data Transfer Service エージェント」の設定をしておいてください.

チュートリアル(?)

https://cloud.google.com/bigquery/transfer/docs/reference/libraries

from google.cloud import bigquery_datatransfer


client = bigquery_datatransfer.DataTransferServiceClient()
project = 'xxx'  # project idはその名前の通り, 名前だけじゃなくてIDも指定していれること exp) `xxx-12345` みたいな

# Get the full path to your project.
parent = client.project_path(project)
print('Supported Data Sources:')

# Iterate over all possible data sources.
for data_source in client.list_data_sources(parent):
    print('{}:'.format(data_source.display_name))
    print('\tID: {}'.format(data_source.data_source_id))
    print('\tFull path: {}'.format(data_source.name))
    print('\tDescription: {}'.format(data_source.description))

Amazon S3: ID: amazon_s3 Full path: projects/xxx/dataSources/amazon_s3 Description: Data from Amazon S3 to BigQuery

よくわからんけど、こんなのがでてくる。とりあえずこれがでてきてたらAPI認証はすんだ.

Pythonで構成を用意して転送の設定を行う

↑の続きでいくと

my_transfer_config = {}
response = client.create_transfer_config(parent, my_transfer_config)

こうやるとデータ転送の設定(? jobかな? 呼び方がわからない)を作ってくれる。

が、ここからとてもめんどかった。 my_transfer_configdict で用意しようとしたのだけど

my_transfer_config = {
    'display_name': 'test5',
    'data_source_id': 'google_cloud_storage',
    'schedule': 'every 1 hours',
    'destination_dataset_id': 'database',
    'params': {}  # ここにどう指定すればいいのかわからん
}

params の指定がわからずに時を過ごす

で、できたので晒す。

githubを漁った結果、↓のコードを見つけた

https://github.com/googleapis/google-cloud-python/blob/66ab881f15fbfcd4632db2cde82a460f1f84ac7e/bigquery_datatransfer/samples/create_scheduled_query.py

ここを参考にして実行した結果.

from google.protobuf import json_format as google_json_format
from google.cloud import bigquery_datatransfer_v1


# 先にparamsのvalueを用意しておく
# 何故か全部まとめてやろうとすると死ぬ
my_transfer_config_params = google_json_format.ParseDict({
    "params": {
        "destination_table_name_template": 'xxx',
        "data_path_template": "gs://xxx/*.json",
        "max_bad_records": "10",
        'skip_leading_rows': '0',
        "delete_source_files": "true",
        'file_format': 'JSON',
        'field_delimiter': ','
    }
}, bigquery_datatransfer_v1.types.TransferConfig())

my_transfer_config = {
    'display_name': 'xxx',
    'data_source_id': 'google_cloud_storage',
    'schedule': 'every 1 hours',
    'destination_dataset_id': 'xxx',
    'params': my_transfer_config_params.params
}

# 設定を作成
my_transfer_config_obj = bigquery_datatransfer_v1.types.TransferConfig(**my_transfer_config)

# 設定をrequest
response = client.create_transfer_config(parent, my_transfer_config)

これでできた...疲れた