【GCP】BigQuery Migration Serviceを使ってクエリを移行してみた

こんにちは!SCSKの山口です。

二連続のBigQuery に関するブログ投稿になります。
今回は、業務で使用する機会のあった「BigQuery Migration Service」が便利だと感じたのでご紹介します。

BigQuery Migration Serviceの概要

BigQueryアイコン

BigQuery Migration Serviceは、”データ ウェアハウスを BigQuery に移行するための包括的なソリューション”です。

10を超える言語からのSQL変換が可能であり、データ転送、データ検証などのツールも用意されています。

BigQuery Migration Service の概要  |  Google Cloud
外部データ ウェアハウスから BigQuery への移行に役立つ一連のツールである、BigQuery Migration Service の概要について説明します。

今回はこのBigQuery Migration Serviceを用いて“SQLの変換”を実際にやってみたいと思います。

BigQuery Migration Serviceを使ってNetezzaからBigQueryへクエリを移行してみる

Netezza 用に作成されたSQLスクリプトは、そのままではBigQuery で使用することができません。

IBM Netezza SQL 変換ガイド  |  BigQuery  |  Google Cloud
IBM Netezza と BigQuery の SQL 言語間で、ステートメント、関数、データ型およびその他の SQL オブジェクトを比較するためのリファレンスを提供します。

そのため、データウェアハウスをBigQuery へ移行した後もSQLスクリプトを使用したい場合は、”クエリの変換”が必要となります。 

ここでは以下の簡単なNetezzaのSQL文を移行してみます。

[Netezza _Example]

CREATE TABLE "hoge_dataset.yamaguchi_test.TEST_TABLE2"
  (
   class INTEGER not null,
   name NATIONAL CHARACTER(20),
   age INTEGER,
   height INTEGER,
   weight INTEGER
  )|

[Netezza _Example2]

SELECT 
       class,
       name
FROM
       "hoge_dataset.yamaguchi_test.TEST_TABLE"
ORDER BY
       class
;

上記2ファイルが入ったフォルダをあらかじめCloud Storageへアップロードしておきます。

Cloud Storageへアップロード

① 「BigQuery Migrartion API」の有効化

BigQuery Migration Serviceを利用するために、まずは「BigQuery  Migration API」を有効化します。

キャプチャを撮る前に先走ってポチってしまったので、有効化後の画面です、スミマセン、、、

「BigQuery Migrartion API」の有効化

② 変換ジョブの作成

BigQueryページの左ペインより「移行-SQL変換」をクリックします。

変換ジョブの作成

BigQuery SQL 変換ページの「変換を開始」(下図赤枠のどちらか)をクリックします。

変換を開始

「変換の構成」を入力し、「次へ」をクリックします。

変換の構成

「ソースの詳細」にて変換対象のファイルが含まれるフォルダを指定し「次へ」をクリックします。

変換対象の最小単位は”フォルダ”です。

ソースの詳細

「ターゲットの詳細」にて出力される変換後のファイルの保存先を指定します。

ターゲットの詳細

ターゲットのパスをソースのパスと同じにすると怒られます。
ターゲットにはソースとは別のパスを指定する必要があります。

ターゲットの詳細エラー

「オプションの設定」にて各種オプションを入力できます。(いったん空欄で実行してみます。)

最後に「作成」をクリックして完了です。

オプションの設定

③ 変換結果確認

問題なく変換が完了したら緑のチェックマークがつきます。

変換結果

ターゲットのパスに行って変換結果のクエリを確認してみましょう。

Outputのフォルダ内に変換結果のファイルが吐き出されています。

変換結果のファイル

入力のファイルと見比べてみます。

  変換前(Netezza SQL) 変換後(GoogleSQL)
Netezza_Example
CREATE TABLE TEST_TABLE
  (
  class INTEGER not null,
  name NATIONAL CHARACTER(20),
  age INTEGER,
  height INTEGER,
  weight INTEGER
)
CREAte TABLE __DEFAULT_DATABASE__.__DEFAULT_SCHEMA__.TEST_TABLE
(
 CLASS INT64,
 NAME STRING,
 AGE INT64,
 HEIGHT INT64,
 WEIGHT INT64
)
;
Netezza_Example2
SELECT 
        class,
        name
FROM
        TEST_TABLE
ORDER BY
        class
;
SELTECT
     TEST_TABLE.CLASS,
     TEST_TABLE.NAME
  FROM
     __DEFAULT_DATABASE__.__DEFAULT_SCHEMA__.TEST_TABLE
ORDER BY
  CLASS
;

一見問題なく変換できてそうですが、これ本当に回るのか、、、?と不安になったので変換後のクエリ文をBigQueryのワークスペースにコピペしてみます。

変換後クエリ実行

「__DEFAULT_DATABASE__と__DEFAULT_SCHEMA__なんて無いよ。」と怒られてしまいました。オプションを空欄にしたツケが回ってきたようです。

次はオプションを入力してやってみます。

④ オプションの設定を利用して変換を実行

オプションに以下を設定して再度変換を実行してみます。

  • デフォルトのデータベース:プロジェクトID
  • スキーマの検索パス:テーブル名

オプションの設定

変換後のクエリは以下の通りです。

CREATE TABLE `hoge_dataset`.yamaguchi_test.TEST_TABLE
(
  CLASS INT64,
  NAME STRING,
  AGE INT64,
  HEIGHT INT64,
  WEIGHT INT64
)
;

これをBigQueryのSQLワークスペースに貼り付けてみます。

変換後クエリ実行

エラーが出ないので、手直しなし(貼り付けのみ)で実行できそうです。

貼り付けたクエリを実行してみます。

変換後クエリ実行結果

実行が成功し、テーブルが無事作成されました。

BigQueryのSQLワークスペース上でのSQL変換

実はBigQueryのSQLワークスペースでも簡単にSQL変換ができます。

先ほど作成したテーブルに下記データをあらかじめ追加しておきます。

テーブルへのデータ追加

それではここからSQLワークスペースでのSQL変換をやってみます。

ワークスペースの「展開」タブ-「SQL変換を有効にする」を選択します。

SQL変換を有効にする

「変換元」のプルダウンで今回はNetezzaを選択します。

変換元の選択

変換後のクエリ文(今回はNetezza_Example2を使用)を貼り付けて、赤枠の「変換」をクリックします。

変換後のクエリ文貼り付け

変換の実行

変換自体は成功しましたが、実行するためにはパス指定を手直しする必要があります。

パス指定を手直しして実行します。

パス指定を修正

修正後実行

実行が成功し、正しく処理できていることが確認できました。

日本語のカラム名には対応している?

そういえば、BigQueryが日本語に対応した旨のリリースノートを見たことを思い出しました。

Google Cloud release notes  |  Documentation

やってみた結果

ブログが長くなりそうなので結果のみ簡単に記載します。(前回投稿ブログの反省点。⇓)

【GCP】BigQuery -パーティショニングによるコスト削減-
BigQueryでの「テーブルの論理パーティション分割の有効性」についてご紹介します。

結論から言いますと、日本語のカラム名を含むクエリの移行は不可能でした。(怒られました。)
ただし、日本語部分を「”」で囲み、文字列として認識させることで回避することが可能でした。

(例)日本語の認識失敗

〇 入力

CREATE TABLE TEST_TABLE
  (
   クラス INTEGER not null,
   氏名 NATIONAL CHARACTER(20),
   年齢 INTEGER,
   身長 INTEGER,
   体重 INTEGER
  )

〇 実行エラー画面

実行エラー画面

〇 出力

出力結果

⇒ エラーメッセージのみで実は変換できているのでは、、、?と淡い期待を抱きつつ実行結果のファイルを覗いてみましたが、やはり怒られていました。(予想通り)

(例)日本語の認識失敗を回避

〇入力

CREATE TABLE TEST_TABLE
  (
   "クラス" INTEGER not null,
   "氏名" NATIONAL CHARACTER(20),
   "年齢" INTEGER,
   "身長" INTEGER,
   "体重" INTEGER
  )

⇒ 日本語部を「”」で囲み、文字列と認識させることで変換できるのでは?とまたまた淡い期待を抱いて実行してみました。

(BigQuery Migration Serviceさえ誤魔化すことができたらBigQuery は日本語を認識してくれるはず。と考えたため。)

〇 実行エラー画面

実行エラー画面

⇒やっぱり怒られた。。。と思ったんですが、よく見ると先ほどと違うエラーが出ています。念のため出力結果を見てみます。

〇出力

出力結果

⇒ なんと変換できていました。(予想外)

変換済みは0%と表記されていますが、変換後のファイルが出力されていました。

〇 出力結果チェック

出力結果チェック

⇒BigQuery 自体は日本語のカラム名に対応しているので、SQLワークスペースへ貼り付けても特にエラーは吐かれませんでした。

(※パス指定部は手直ししています。)

テーブル作成チェック

⇒実行してみたところ、期待通りのテーブルが作成されました。

所感

実際に使用してみた所感です。

使用したコードが簡単であった影響も考えられますが、「ちゃんと動いてくれる。使えそう。」というのが正直な感想です。
日本語対応等のBigQueryの仕様変更に追い付いていない点がありますが、変換ツールとして十分に使用できるレベルだと感じました。

今回はBigQuery Migration Serviceを用いたファイル単位での変換と、BigQueryのSQLワークスペースでのソースコード単位での変換 の二つをやってみましたが、これらを上手く使い分けることも重要だと思います。

ただし、より複雑なクエリ文の変換となる場合は、現状、完ぺきに変換をこなせない部分もありそうです。
その部分は機会があればまた次回のブログで書きたいと思います。

最後に

二連続のBigQuery に関するブログ投稿となりました。

前回投稿したブログがかなりのボリュームになってしまったので今回は簡潔にわかりやすく。と思っていたんですが、今見ると今回もなかなかのボリュームになっていました。

アウトプットのスピードももちろんですが、質も徐々に上げていきたいと考えています。

タイトルとURLをコピーしました