CLIを使用してクエリを発行し、結果を出力することができます。以下の手順では、CLIを使用してクエリ出力結果をフォーマットする方法を説明します。
単一のクエリの結果を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で表されます:
mysql://username:password@hostname:port/database/tableここで:
- mysql は、MySQLへの結果出力を示します
- username と password は、MySQLサーバーへの認証情報です
- hostname は、MySQLサーバーのホスト名です
- port は、MySQLサーバーにアクセスできるポート番号です。「:」はオプションであり、デフォルトでは3306と想定されます
- database は、宛先データベースの名前です
- table は、上記のデータベース内のテーブルの名前です。クエリ出力の実行時に存在しない場合もありますが、その場合はユーザーのために指定された名前のテーブルが作成されます
ジョブ結果のMySQLサーバーへの書き込みは、以下のオプションをサポートしています。
データを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 # update4つのモードすべてがアトミックです。
「host」セクションでは、ポートも指定できます。 以下は例です:
mysql://superadmin:superstrongpassword@data.science.com:27013/transaction/user_infoこれはデフォルトのモードです。クエリ結果はテーブルに追加されます。テーブルが存在しない場合は、新しいテーブルが作成されます。
テーブルがすでに存在する場合、既存のテーブルの行はクエリ結果で置き換えられます。テーブルが存在しない場合は、新しいテーブルが作成されます。
単一のトランザクションで以下の3つのステップを実行することにより、アトミック性(テーブルのコンシューマーが常に一貫性のあるデータを持つように)を実現します。
- 一時テーブルを作成します。
- 一時テーブルに書き込みます。
- ALTER TABLE RENAMEを使用して、既存のテーブルを一時テーブルで置き換えます。
replaceモードを使用すると、MySQLテーブルのスキーマが変更される可能性があります。ターゲットテーブルへのスキーマ変更を避けるには、「Preserve schema?」オプションを選択してください。
システムは最初に既存のテーブルをトランケートし、次にクエリ結果を挿入します。テーブルが存在しない場合は、新しいテーブルが作成されます。
REPLACEとは異なり、TRUNCATEはテーブルのインデックスを保持します。
このモードは、以下のステップを実行することにより、新しいデータを挿入し、既存のデータを更新します。
- 一時テーブルを作成します。
- 一時テーブルに書き込みます。
- 一時テーブルから宛先テーブルにデータを更新します。
- 一時テーブルから宛先テーブルに残りのデータを挿入します。
一意キーを指定するには、uniqueパラメータを設定できます。これはキーのカンマ区切りのリストです。すべてのキーの値が既存のレコードのすべてと一致する場合、そのレコードは置き換えられます。以下は例です:
mysql://superadmin:superstrongpassword@data.science.com:27013/transaction/user_infomode=update&unique=column1%2Ccolumn2CLIでは、パラメータ内のカンマはURLエンコードする必要があります(「,」は「%2C」にする必要があります)。
ジョブ結果のMySQLサーバーへの書き込みは、オプションのURLパラメータとして指定できる以下の追加オプションをサポートしています。
sslオプションは、MySQLサーバーへの接続にSSLを使用するかどうかを決定します。
Treasure DataからMySQLサーバーへの接続にSSLを使用します。MySQLサーバーは、SSL接続を受け入れるように設定されている必要があります。
mysql://user:password@host/database/table?ssl=trueTreasure DataからMySQLサーバーへSSLを使用しません。
mysql://user:password@host/database/table?ssl=falseTreasure 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へのジョブ結果は、MySQLのINT UNSIGNED型をサポートしていません。その値は予期しない値に変換されます。