Skip to content
Last updated

MySQL Tables Export Integration CLI

CLIを使用してクエリを発行し、結果を出力することができます。以下の手順では、CLIを使用してクエリ出力結果をフォーマットする方法を説明します。

TD Queryコマンドの使用方法

単一のクエリの結果をMySQLサーバーに出力するには、td queryコマンドに--resultオプションを追加します。ジョブが完了すると、結果がデータベースに書き込まれます:

$ td query --result 'mysql://user:password@host/database/table' \
  -w -d testdb \
  "SELECT code, COUNT(1) FROM www_access GROUP BY code"

スケジュールされたジョブ

出力が体系的にMySQLに書き込まれるスケジュールされたクエリを作成するには、td sched:createコマンドでスケジュールを作成する際に--resultオプションを追加します。ジョブが実行されるたびに、結果がmytblに書き込まれます。

$ td result:create mydb mysql://user:password@host/database
$ td sched:create hourly_count_example "0 * * * *" -d testdb "select count(*) from www_access" --result mydb:mytbl

結果出力URLフォーマット

結果出力先は、以下の形式のURLで表されます:

mysql://username:password@hostname:port/database/table

ここで:

  • mysql は、MySQLへの結果出力を示します
  • usernamepassword は、MySQLサーバーへの認証情報です
  • hostname は、MySQLサーバーのホスト名です
  • port は、MySQLサーバーにアクセスできるポート番号です。「:」はオプションであり、デフォルトでは3306と想定されます
  • database は、宛先データベースの名前です
  • table は、上記のデータベース内のテーブルの名前です。クエリ出力の実行時に存在しない場合もありますが、その場合はユーザーのために指定された名前のテーブルが作成されます

オプション

ジョブ結果のMySQLサーバーへの書き込みは、以下のオプションをサポートしています。

データを変更するモード(Append/Replace/Truncate/Update)

データを4つの方法で追加または削除できます。

mysql://user:password@host/database/table               # append
mysql://user:password@host/database/table?mode=append   # append
mysql://user:password@host/database/table?mode=replace  # replace
mysql://user:password@host/database/table?mode=truncate # truncate
mysql://user:password@host/database/table?mode=update   # update

4つのモードすべてがアトミックです。

「host」セクションでは、ポートも指定できます。 以下は例です:

mysql://superadmin:superstrongpassword@data.science.com:27013/transaction/user_info

APPEND

これはデフォルトのモードです。クエリ結果はテーブルに追加されます。テーブルが存在しない場合は、新しいテーブルが作成されます。

REPLACE

テーブルがすでに存在する場合、既存のテーブルの行はクエリ結果で置き換えられます。テーブルが存在しない場合は、新しいテーブルが作成されます。

単一のトランザクションで以下の3つのステップを実行することにより、アトミック性(テーブルのコンシューマーが常に一貫性のあるデータを持つように)を実現します。

  1. 一時テーブルを作成します。
  2. 一時テーブルに書き込みます。
  3. ALTER TABLE RENAMEを使用して、既存のテーブルを一時テーブルで置き換えます。

replaceモードを使用すると、MySQLテーブルのスキーマが変更される可能性があります。ターゲットテーブルへのスキーマ変更を避けるには、「Preserve schema?」オプションを選択してください。

TRUNCATE

システムは最初に既存のテーブルをトランケートし、次にクエリ結果を挿入します。テーブルが存在しない場合は、新しいテーブルが作成されます。

REPLACEとは異なり、TRUNCATEはテーブルのインデックスを保持します。

UPDATE

このモードは、以下のステップを実行することにより、新しいデータを挿入し、既存のデータを更新します。

  1. 一時テーブルを作成します。
  2. 一時テーブルに書き込みます。
  3. 一時テーブルから宛先テーブルにデータを更新します。
  4. 一時テーブルから宛先テーブルに残りのデータを挿入します。

一意キーを指定するには、uniqueパラメータを設定できます。これはキーのカンマ区切りのリストです。すべてのキーの値が既存のレコードのすべてと一致する場合、そのレコードは置き換えられます。以下は例です:

mysql://superadmin:superstrongpassword@data.science.com:27013/transaction/user_infomode=update&unique=column1%2Ccolumn2

CLIでは、パラメータ内のカンマはURLエンコードする必要があります(「,」は「%2C」にする必要があります)。

追加オプション

ジョブ結果のMySQLサーバーへの書き込みは、オプションのURLパラメータとして指定できる以下の追加オプションをサポートしています。

sslオプション

sslオプションは、MySQLサーバーへの接続にSSLを使用するかどうかを決定します。

ssl=true

Treasure DataからMySQLサーバーへの接続にSSLを使用します。MySQLサーバーは、SSL接続を受け入れるように設定されている必要があります。

mysql://user:password@host/database/table?ssl=true

ssl=false(デフォルト)

Treasure DataからMySQLサーバーへSSLを使用しません。

mysql://user:password@host/database/table?ssl=false

文字エンコーディング

Treasure Dataは常に文字エンコーディングとしてUTF-8を使用します。また、デフォルトでUTF-8を使用するようにデータベースを設定する必要があります。エンコーディングに関連する問題が発生した場合は、以下の設定を確認してください。

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

MySQLのINT UNSIGNED型

MySQLへのジョブ結果は、MySQLのINT UNSIGNED型をサポートしていません。その値は予期しない値に変換されます。