TreasureDataのSQLでパラメーターを使いたい
1. はじめに
ここでいうSQLでパラメーターが使いたいというのは以下のようなSQLを意味します。
SELECT * from www_access WHERE code=@code
残念ながらTreasure DataのSQLは単体でパラメータ(変数)を扱うことができません。
注意: Presto自体にPrepareとExecuteという機能があり、上記のようなパラメーター化されたクエリを実行することは可能なのですが、Treasure Dataでは利用できません。 PrestoのPrepareとExecuteについてはこちらをご確認ください。 prestosql.io
ではどうしたら良いのでしょうか?
2. Workflowを使う
Treasure Data WorkflowはTreasure DataによってホスティングされているDigdagサービスです。
Digdag自体には変数を扱うことができる機能があるので、その機能を利用してクエリをパラメーター化してみましょう。
_export: td: database: sample_datasets code_parameter: 200 +paramtered_query: td>: query: "SELECT * FROM www_access WHERE code=${code_parameter}"
_exportで宣言した変数をquery内で呼び出して使用しております。
定常的に実行されるクエリならばこれで良いかもしれません。ただマーケティング部門のユーザーに使ってもらう時にはymlを編集してもらうというのはやや抵抗感があるかもしれません。
そういう場合にはGoogle Colboratoryを使うのはいかがでしょうか?
3. Google Colaboratoryを使う
Google ColaboratoryはGoogleがホスティングしてくれているJupyter Notebookサービスです。そこにTreasure DataのSDKである、td-client-pythonをインストールして簡易的なTreasure Dataへのインターフェースにしまえという発想です。
import os from getpass import getpass os.environ['TD_API_KEY'] = getpass('Enter TD API KEY ') os.environ['TD_API_SERVER'] = 'https://api.treasuredata.com' code_parameter = input('code_paramter =') mport tdclient query = f"SELECT * FROM www_access WHERE code={code_parameter}" with tdclient.Client() as td: job = td.query("sample_datasets", query, type="presto") job.wait() for row in job.result(): print(repr(row))