GCSに格納した日付別の(※)csvファイルをシャード化テーブルとしてBigQueryに一括でインポートする方法のメモ。
※同一カラムをもつが、日付別にファイルが分割されている
パーティショニングとシャーディングの違いについてはGoogle公式ドキュメントをご参照ください。
前提
- Google Cloud Platformでプロジェクトを作成済みであること
- 作成済みプロジェクトに対して課金が有効になっていること
- Google Cloud SDKをインストール済みであること
準備
GCSへBigQueryにインポートしたいcsvを格納
以下の構成でGCSにBigQueryにインポートしたいcsvを格納します。
ファイル名の"_"以降がシャード化される日付になります。
bucket
└── dir
├── test_20200101.csv
├── test_20200102.csv
├── test_20200103.csv
…
└── test_20200131.csv
スクリプト作成
GCSからBigQueryにインポートするためのスクリプトを作成します。
ローカルに以下のファイルレイアウトを用意します。
ローカルのファイルレイアウト
dir
├── .env
└── import_bq_from_gcs.sh
設定ファイル
.env
# プロジェクトID
PROJECT_ID=********
# BQにインポートしたいcsvを格納しているパス
GCS_PATH=gs://bucket/test_bq_1
# インポート先データセット名
DATA_SET=test_bq
# インポート先テーブル名(prefix)
TABLE_PREFIX=table
インポートスクリプト
GCSにあるインポート対象のcsvごとにBigQueryにインポートしていきます。
import_bq_from_gcs.sh
# !/bin/sh
set -e
# 環境変数
. .env
# プロジェクトIDを設定
gcloud config set project ${PROJECT_ID}
echo "set PROJECT_ID"
# 指定したGCSパス配下のファイルごとに処理
for file_full_path in `gsutil ls ${GCS_PATH}`
do
# ファイルパス抽出
file_path=${file_full_path##*/}
# ファイル名抽出
file_name=${file_path%.*}
# ファイル名suffix('_'以降)抽出
file_suffix=${file_name##*_}
table_name=${DATA_SET}.${TABLE_PREFIX}_${file_suffix}
# ファイル名が存在
if [ ${#file_name} -gt 0 ]; then
bq load --autodetect --source_format=CSV ${table_name} ${file_full_path}
echo "import from ${file_full_path} to ${table_name}"
fi
done
GCSからBigQueryにインポート
準備完了後、.env
、import_bq_from_gcs.sh
と同一ディレクトリにて以下を実行します。
sh sh:import_bq_from_gcs.sh
実行後、BigQueryのコンソールを確認すると、日付別シャード化テーブルとしてインポートできていることを確認できました!
