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へのインターフェースにしまえという発想です。

f:id:mickeeey:20200810173341j:plain

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))

4. まとめ

  • TreasureData単体ではパラメーター付きSQLは実行できない
  • WorkflowやClient SDKを組み合わせる事で実現することは可能。