1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ちゅらデータAdvent Calendar 2023

Day 5

BigQueryからGCSにエクスポートし、外部ステージ経由でSnowflakeのテーブルにCOPY INTOするときの具体的クエリと注意点

Last updated at Posted at 2023-12-04

前提

  • BigQuery上、Snowflake上での権限周りの設定は済んでいること
  • Snowflake側の外部ステージの設定は済んでいること
  • BigQuery上とSnowflake上に同じスキーマのテーブルがすでに作成済みであること

コマンド

BigQuery→GCSエクスポート

export data文をBigQuery上で発行して行います。
この例ではgzip圧縮したCSV形式で行います。

EXPORT DATA OPTIONS(
  -- GCSのパス。適宣変えてください。
  uri='gs://some_bucket/path_prefix/*.csv.gz',
  -- 圧縮形式を指定(GZIP, DEFLATE, SNAPPY)。未指定の場合は圧縮無し
  compression='GZIP',
  -- ファイルフォーマットを指定。CSV, JSON, AVROが選択可能
  format='CSV',
  -- ファイルが存在していた場合は上書きたいのでtrue。未指定の場合はfalseになる
  overwrite=true,
  -- ヘッダ行はつけないのでfalse
  header=false,
  -- 区切り文字を指定。デフォルトは「,」だがわかりやすいように明示的に指定
  field_delimiter=','
) AS
-- クエリ。適宜変える。ソーステーブルにカラム追加されたときにエラーにならないようにするにはカラムを明示的に指定する。今回は簡易的に行うだけなので*を指定。洗い替えを想定しているのでWHERE句はつけていないが、追記であれば更新日時などの条件をつけること
select 
  *
from
  `project_id.dataset.src_table_name`

Snowflake側

-- 削除。洗い替えを想定しているため削除している。追記であれば不要
truncate table database_name.schama_name.dst_table_name;

-- 全量投入。カラムは適宣追加・削除する
copy into database_name.schama_name.dst_table_name 
from @database_name.schema.external_storage_name/path/prefix/
-- ファイルフォーマット設定
FILE_FORMAT = (
    -- CSV形式
    TYPE = CSV
    -- gzipしているので指定
    , COMPRESSION = GZIP
    -- export data文ではカラムにエスケープが必要な値が入っているときは「"」で囲われるのでこの指定が必要
    , FIELD_OPTIONALLY_ENCLOSED_BY = '"'
    -- ↓にNONEを指定しないと、BigQuery上のカラム値に「abc\」のようなバックスラッシュが末尾に来る文字列があったときに、その後ろの「,」が区切り文字として認識されずにCOPY INTO時にエラーとなってしまうため必ず指定する
    , ESCAPE_UNENCLOSED_FIELD = NONE
)
-- 再取り込みのことを考え、必ず読み込むようにFORCEをつける
FORCE = true;

注意点

  • GCSのAPIコール数
    • 大きなテーブル(数百GB〜数TB)を転送するときにはGCSに大量のファイルが作成される。1日に何回も転送するなど高頻度で転送する場合にはGCSのAPIコール課金に注意が必要。料金計算ツールCloud Storage の料金
      で試算をすること
  • 実行前後での外部ステージクリーンアップ
    • 外部ステージにエクスポートしたファイルをそのまま残しておくとストレージ料金がかかったり、次回読み込み時の邪魔になるため、実行後に削除すること
    • 前回の転送が途中でエラーとなった場合にGCSパス上に中途半端にファイルが残っているかもしれない。実行直前にもクリーンアップすること
    • クリーンアップ用クエリ例:Snowflake上で rm @database_name.schema.external_storage_name/path/prefix/;
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?