Appearance
cdm sql
cdm sql サブコマンドで、コネクションに対して SQL を実行・検証します。
cdm sql <subcommand> [arguments] [options]| サブコマンド | 用途 |
|---|---|
sql run | SQL を実行し、結果が出るまで待機して取得 |
sql dry-run | SQL の dry-run(スキーマ/処理量の見積もり) |
sql create-job | SQL の非同期ジョブを作成し、ジョブ ID を出力 |
sql get-job-metadata | ジョブの状態を取得 |
sql get-job-result | ジョブの結果行を取得 |
sql cancel-job | ジョブへのキャンセル要求を送信 |
SQL の渡し方
SQL を入力とするサブコマンド(sql run, sql dry-run, sql create-job)では、以下のいずれかの方法で SQL を渡します。
- 位置引数:
cdm sql run -c <id> "SELECT * FROM users" - 標準入力: 標準入力が TTY でない場合(パイプ・リダイレクト時)、自動的に標準入力から SQL を読み込みます
両方が指定された場合(位置引数があり、かつ標準入力もパイプされている場合)は、エラーとして exit 1 で終了します。
cdm notebook build-sql と組み合わせる場合の例:
bash
cdm notebook build-sql my.cnb.md -k pageId:p1/sqlId:q1 | cdm sql run -c 671ef14b0d08cf6c657df7daSQL の実行(同期)
cdm sql run [<sql>]
-c, --connection-id <id> コネクション ID(必須)
--timeout <sec> ジョブ完了を待つタイムアウト秒数(既定: 300)
--limit <n> 取得する最大行数(既定: 1000、上限: 1000)
--profile <name> 利用する profile を指定SQL を実行し、結果が確定するまで待機して JSON で出力します。
sql create-jobからsql get-job-resultまでの処理を一括で行います- SQL の渡し方は SQL の渡し方 を参照してください
- ジョブが
ERRORで終了した場合、エラーメッセージを出力してexit 1で終了します - 以下のいずれかが発生した場合、ジョブのキャンセルを試みた上で、エラーメッセージを出力して
exit 1で終了します。エラーメッセージにはジョブ ID を含めるので、後からsql get-job-metadataで状態を確認できます--timeoutを超えてもジョブが完了しません- コマンド実行中に SIGINT(
Ctrl+C)を受け取ります
- 上記でキャンセル自体が失敗した場合は、その旨を追記して
exit 1で終了します(ジョブの実行は継続している可能性があります) - 出力は
sql get-job-resultと同じ形式です
SQL の dry-run
cdm sql dry-run [<sql>]
-c, --connection-id <id> コネクション ID(必須)
--profile <name> 利用する profile を指定SQL を実行せずに dry-run を行い、結果を JSON で取得します。
- SQL の渡し方は SQL の渡し方 を参照してください
- BigQuery では
bqTotalBytesProcessedとbqFieldsが出力されます - BigQuery 以外の場合、問題がなければ空の JSON オブジェクト
{}を出力します - dry-run 自体が失敗した場合(構文エラー等)、
errorMessageを含む JSON をそのまま出力します(exit 0)
出力例(BigQuery):
json
{
"bqTotalBytesProcessed": 1048576,
"bqFields": [
{ "name": "id", "type": "STRING" },
{ "name": "email", "type": "STRING" }
]
}エラー時の出力例:
json
{ "errorMessage": "Function not found: hoge at [1:8]" }ジョブの作成
cdm sql create-job [<sql>]
-c, --connection-id <id> コネクション ID(必須)
--profile <name> 利用する profile を指定SQL の非同期ジョブを作成し、ジョブ ID を JSON で出力します。
- SQL の渡し方は SQL の渡し方 を参照してください
- このコマンドはジョブの完了を待機しません。完了の確認は
sql get-job-metadata、結果の取得はsql get-job-resultを利用してください
出力例:
json
{ "jobId": "nFsupzWNxYUaDbSaSKcTqHvpOVU" }ジョブ状態の取得
cdm sql get-job-metadata <job-id>
-c, --connection-id <id> コネクション ID(必須)
--profile <name> 利用する profile を指定指定したジョブの現在の状態を JSON で取得します。
<job-id>は 位置引数で必ず指定 します- ジョブが完了していない場合(
PENDING/RUNNING)でも、その時点の状態をそのまま出力します(exit 0) - ジョブが見つからない場合など、取得に失敗した場合は、エラーメッセージを出力して
exit 1で終了します
出力例:
json
{
"jobStatus": "SUCCESS",
"sql": "SELECT * FROM users",
"resultRowCount": 123,
"spendTimeMsec": 1450,
"resultBytes": 4096,
"totalBytesProcessed": 1048576
}ジョブ結果の取得
cdm sql get-job-result <job-id>
-c, --connection-id <id> コネクション ID(必須)
--limit <n> 取得する最大行数(既定: 1000、上限: 1000)
--profile <name> 利用する profile を指定指定したジョブの結果行を JSON で取得します。
<job-id>は 位置引数で必ず指定 します- ジョブが完了していない場合や ERROR 状態の場合、
jobResultStatusが"ERROR"の JSON をそのまま出力します(exit 0)- ジョブ完了を待ってから取得したい場合は、先に
sql get-job-metadataでjobStatusを確認してください
- ジョブ完了を待ってから取得したい場合は、先に
- 通信エラー等、結果の取得に失敗した場合は、エラーメッセージを出力して
exit 1で終了します
出力例:
json
{
"jobResultStatus": "SUCCESS",
"totalRows": 123,
"totalBytesProcessed": 1048576,
"columns": [
{ "name": "id", "type": "STRING" },
{ "name": "email", "type": "STRING" }
],
"rows": [
{ "id": "u1", "email": "a@example.com" },
{ "id": "u2", "email": "b@example.com" }
]
}ジョブのキャンセル
cdm sql cancel-job <job-id>
-c, --connection-id <id> コネクション ID(必須)
--profile <name> 利用する profile を指定指定したジョブに対してキャンセル要求を送ります。
<job-id>は 位置引数で必ず指定 します- キャンセル要求を送り、エラーが返らなかった場合、空の JSON オブジェクト
{}を出力してexit 0で終了します - 要求の送信に失敗した場合、エラーメッセージを出力して
exit 1で終了します - ジョブの状態を確認する場合は
sql get-job-metadataを利用してください