Vantage でスクリプトを実行する方法
概要
場合によっては、SQL では簡単に表現できない複雑なロジックをデータに適用する必要があります。1つのオプションは、ユーザー定義関数(UDF)でロジックをラップすることです。このロジックが UDF でサポートされていない言語で既にコーディングされている場合はどうなるでしょうか? Script Table Operator は、ロジックをデータに取り込んで Vantage 上で実行できるようにする Vantage の機能です。このアプローチの利点は、操作するために Vantage からデータを取得する必要がないことです。また、Vantage でデータ アプリケーションを実行することにより、その並列性を活用できます。アプリケーションがどのように拡張されるかを考える必要はありません。Vantage にお任せください。
前提条件
Teradata Vantageインスタンスへのアクセス。
Vantage のテスト インスタンスが必要な場合は、 https://clearscape.teradata.com. で無料でプロビジョニングできます。 |
Hello World
簡単なことから始めましょう。データベースに「Hello World」を出力させたい場合はどうすればよいでしょうか?
SELECT *
FROM
SCRIPT(
SCRIPT_COMMAND('echo Hello World!')
RETURNS ('Message varchar(512)'));
以下のとおりです。
Message ------------ Hello World! Hello World!
ここで何が起こったのか分析してみましょう。SQLには`echo Hello World!`が含まれています。これはBashコマンドです。さて、Bash コマンドを実行する方法がわかりました。しかし、なぜ 1 行ではなく 2 行が取得されたのでしょうか? これは、単純なスクリプトが各 AMP で 1 回実行され、たまたま 2 つの AMP があるためです。
-- Teradata magic that returns the number of AMPs in a system
SELECT hashamp()+1 AS number_of_amps;
Returns:
number_of_amps -------------- 2
この単純なスクリプトは、Script Table Operator (STO) の背後にある考え方を示しています。スクリプトを提供すると、データベースはそれを AMP ごとに 1 回ずつ並行して実行します。これは、スクリプト内に変換ロジックがあり、処理するデータが大量にある場合に魅力的なモデルです。通常、アプリケーションに同時並行性を組み込む必要があります。STO にそれを実行させることで、Teradata がデータに適切な同時並行性レベルを選択できるようになります。
サポートされる言語
さて、Bash で echo
を行いましたが、Bash は複雑なロジックを表現するための生産的な環境とは言えません。 では、他にどのような言語がサポートされているのでしょうか? 幸いなことに、Vantage ノードで実行できるバイナリはすべて STO で使用できることです。バイナリとそのすべての依存関係をすべての Vantage ノードにインストールする必要があることに注意してください。実際には、これは、管理者がサーバー上で維持したいと考え、維持できるものにオプションが制限されることを意味します。Python は非常に人気のある選択肢です。
スクリプトをアップロードする
Hello World は非常にエキサイティングですが、大きなファイルに既存のロジックがある場合はどうなるでしょうか。確かに、スクリプト全体を貼り付けたり、SQL クエリーで引用符をエスケープしたりする必要はありません。スクリプトのアップロードの問題は、ユーザーインストールファイル(UIF)機能で解決します。
以下の内容の helloworld.py
スクリプトがあるとします。
print("Hello World!")
スクリプトが /tmp/helloworld.py
のローカルマシンにあると仮定します。
まず、Vantage でアクセス権を設定する必要があります。クリーンな状態を保つために、新しいデータベースを使用してこれを実行します。
-- Create a new database called sto
CREATE DATABASE STO
AS PERMANENT = 60e6, -- 60MB
SPOOL = 120e6; -- 120MB
-- Allow dbc user to create scripts in database STO
GRANT CREATE EXTERNAL PROCEDURE ON STO to dbc;
以下のプロシージャ コールを使用して、スクリプトを Vantage にアップロードできます。
call SYSUIF.install_file('helloworld',
'helloworld.py', 'cz!/tmp/helloworld.py');
スクリプトがアップロードされたので、以下のように呼び出すことができます。
-- We switch to STO database
DATABASE STO
-- We tell Vantage where to look for the script. This can be
-- any string and it will create a symbolic link to the directory
-- where our script got uploaded. By convention, we use the
-- database name.
SET SESSION SEARCHUIFDBPATH = sto;
-- We now call the script. Note, how we use a relative path that
-- starts with `./sto/`, which is where SEARCHUIFDBPATH
-- is pointing.
SELECT *
FROM SCRIPT(
SCRIPT_COMMAND('python3 ./sto/helloworld.py')
RETURNS ('Message varchar(512)'));
最後の呼び出しでは次が返されます。
Message ------------ Hello World! Hello World!
これは大変な作業でしたが、まだ Hello World に到達しています。SCRIPT
にデータを渡してみましょう。
Vantage に保存されているデータを SCRIPT に渡す
これまで、スタンドアロン スクリプトを実行するために SCRIPT
オペレータを使用してきました。ただし、Vantage でスクリプトを実行する主な目的は、Vantage 内のデータを処理することです。Vantageからデータを取得して、SCRIPT
に渡す方法を見てみましょう。
まず、数行のテーブルを作成します。
-- Switch to STO database.
DATABASE STO
-- Create a table with a few urls
CREATE TABLE urls(url varchar(10000));
INS urls('https://www.google.com/finance?q=NYSE:TDC');
INS urls('http://www.ebay.com/sch/i.html?_trksid=p2050601.m570.l1313.TR0.TRC0.H0.Xteradata+merchandise&_nkw=teradata+merchandise&_sacat=0&_from=R40');
INS urls('https://www.youtube.com/results?search_query=teradata%20commercial&sm=3');
INS urls('https://www.contrivedexample.com/example?mylist=1&mylist=2&mylist=...testing');
以下のスクリプトを使用してクエリーパラメータを解析します。
from urllib.parse import urlparse
from urllib.parse import parse_qsl
import sys
for line in sys.stdin:
# remove leading and trailing whitespace
url = line.strip()
parsed_url = urlparse(url)
query_params = parse_qsl(parsed_url.query)
for element in query_params:
print("\t".join(element))
スクリプトでは、URLが1行ずつ stdin
に入力されると仮定していることに注記してください。また、値の間の区切り記号としてタブ文字を使用して、結果を 1 行ずつ出力する方法にも注目してください。
スクリプトをインストールしましょう。ここでは、スクリプト ファイルがローカル マシンの /tmp/urlparser.py
にあると仮定します。
CALL SYSUIF.install_file('urlparser',
'urlparser.py', 'cz!/tmp/urlparser.py');
スクリプトがインストールされたら、 urls
テーブルからデータを取得し、それをスクリプトに入力してクエリーパラメータを取得します。
-- We inform Vantage to create a symbolic link from the UIF directory to ./sto/
SET SESSION SEARCHUIFDBPATH = sto ;
SELECT *
FROM SCRIPT(
ON(SELECT url FROM urls)
SCRIPT_COMMAND('python3 ./sto/urlparser.py')
RETURNS ('param_key varchar(512)', 'param_value varchar(512)'));
その結果、クエリーパラメータとその値を取得します。行の数は、キーと値のペアの数と同じです。また、スクリプトで出力されるキーと値の間にタブを挿入したため、STO から 2 つの列が取得されます。
param_key |param_value ------------+----------------------------------------------------- q |NYSE:TDC _trksid |p2050601.m570.l1313.TR0.TRC0.H0.Xteradata merchandise search_query|teradata commercial _nkw |teradata merchandise sm |3 _sacat |0 mylist |1 _from |R40 mylist |2 mylist |...testing
テーブルへのSCRIPT出力の挿入
Vantage からデータを取得し、それをスクリプトに渡して出力を取得する方法を学びました。この出力をテーブルに保存する簡単な方法はありますか? もちろん、あります。上記の 選択 を CREATE TABLE
文と組み合わせることができます。
-- We inform Vantage to create a symbolic link from the UIF directory to ./sto/
SET SESSION SEARCHUIFDBPATH = sto ;
CREATE MULTISET TABLE
url_params(param_key, param_value)
AS (
SELECT *
FROM SCRIPT(
ON(SELECT url FROM urls)
SCRIPT_COMMAND('python3 ./sto/urlparser.py')
RETURNS ('param_key varchar(512)', 'param_value varchar(512)'))
) WITH DATA
NO PRIMARY INDEX;
では、`url_params`テーブルの内容を検査してみましょう。
SELECT * FROM url_params;
以下の出力が表示されるはずです。
param_key |param_value ------------+----------------------------------------------------- q |NYSE:TDC _trksid |p2050601.m570.l1313.TR0.TRC0.H0.Xteradata merchandise search_query|teradata commercial _nkw |teradata merchandise sm |3 _sacat |0 mylist |1 _from |R40 mylist |2 mylist |...testing
まとめ
このクイック スタートでは、Vantage のデータに対してスクリプトを実行する方法を学習しました。Script Table Operator (STO) を使用してスクリプトを実行しました。オペレータを使用すると、データにロジックを適用できます。スクリプトを AMP ごとに 1 つずつ並行して実行することで、同時並行性の考慮事項をデータベースにオフロードします。スクリプトを指定するだけで、データベースがそれを並行して実行します。
さらに詳しく
ご質問がある場合、またはさらにサポートが必要な場合は、コミュニティ フォーラムにアクセスしてサポートを受け、他のコミュニティ メンバーと交流してください。 |