16.20 - 例: SCRIPTテーブル演算子関数 - Teradata Vantage NewSQL Engine

Teradata Vantage™ SQL演算子およびユーザー定義関数

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
管理
featnum
B035-1210-162K-JPN

以下のコードでhelloworld.pyというファイルを/rootディレクトリに作成します。

#!/usr/bin/python
print 'hello world!'

ファイルをデータベースにインストールします。

DATABASE mydatabase;
call SYSUIF.install_file('helloworld',
                         'helloworld.py', 'cz!/root/helloworld.py');

スクリプトを実行します。

SET SESSION SEARCHUIFDBPATH = mydatabase;
SELECT DISTINCT *
FROM SCRIPT (
	SCRIPT_COMMAND('./mydatabase/helloworld.py')
	RETURNS ('text VARCHAR(30)')
);

以下の例では、スクリプトとその他のファイルをインストールしてから、SCRIPTテーブル演算子を実行します。

DATABASE mydb;
SET SESSION SEARCHUIFDBPATH = mydb;
call SYSUIF.install_file('my_analytics',
                         'cz!my_analytics.sh!/tmp/my_analytics.sh');
call SYSUIF.install_file('my_model',
            'cz!my_model.model!/tmp/my_model.sh');
call SYSUIF.install_file('my_data',
                         'cz!my_data.dat!/tmp/my_data.dat');
Select * from SCRIPT( on data_table
		SCRIPT_COMMAND('./mydb/my_analytics.sh –mymodel ./mydb/my_model.model –myadditionaldata ./mydb/my_data.dat')
		RETURNS('*','score varchar(10)');

この例では、SCRIPTテーブル演算子を使用してPythonスクリプト ファイルを呼び出します。スクリプトmapper.pyはテキスト入力の行(“Old Macdonald Had A Farm”)を読み込み、その行を個別の語に分割し、各語に対し新しい行を作成します。

Pythonスクリプトの例:

#!/usr/bin/python
import sys
# input comes from STDIN (standard input)
for line in sys.stdin:
    # remove leading and trailing whitespace
    line = line.strip()
    # split the line into words
    words = line.split()
    # increase counters
    for word in words:
        # write the results to STDOUT (standard output);
        # what we output here will be the input for the
        # Reduce step, i.e. the input for reducer.py
        #
        # tab-delimited; the trivial word count is 1
print '%s\t%s' % (word, 1)

スクリプトをインストールするには、以下のコマンドを実行します。

CALL SYSUIF.INSTALL_FILE('mapper', 'mapper.py'
                         'cz!/tmp/mapper.py');

テーブル境界には文がテキスト入力の1行として含まれています。

Id int Name varchar(100)
1 Old Macdonald Had A Farm

文を個別の語に分割するには、以下のスクリプトを実行します。

SELECT * FROM SCRIPT
( ON ( SELECT name FROM barrier )	
SCRIPT_COMMAND('./mydb/mapper.py')
	RETURNS ( 'word varchar(10)', 'count_input int' ) ) AS tab;
);

結果:

Word Count_input
Old 1
Macdonald 1
Had 1
A 1
Farm 1

以下の例では、Pythonの組み込みモジュールの一部を使用して、WebサイトのURL問合わせ文字列からJSONオブジェクトを作成します。これは、JSONデータ型を使用した問合わせが可能になるように、Web URLデータをJSONに変換する場合に有用です。

スクリプトには、Pythonバージョン2.6以降がシステムにインストールされていることが必要になります。

‘urltojson.py’ Pythonスクリプト:

#!/usr/bin/python
import sys
import json
import urlparse
for line in sys.stdin:
    print json.dumps(urlparse.parse_qs(urlparse.urlparse(line.rstrip('
	\n')).query))

スクリプトをインストールし、サンプル データで実行するSQL:

DATABASE mytestdb;
create table sourcetab(url varchar(10000));
ins sourcetab('https://www.google.com/finance?q=NYSE:TDC');
ins sourcetab('http://www.ebay.com/sch/i.html?_trksid=p2050601.m570.l1313.TR0.TRC0.H0.Xteradata+merchandise&_nkw=teradata+merchandise&_sacat=0&_from=R40');
ins sourcetab('https://www.youtube.com/results?search_query=teradata%20commercial&sm=3');
ins sourcetab('https://www.contrivedexample.com/example?mylist=1&mylist=2&mylist=...testing');
-- This assumes that urltojson.py is in the current directory.
call sysuif.replace_file('urltojson', 'urltojson.py', 'cz!urltojson.py', 0);
set session searchuifdbpath=mytestdb;
select cast(JSONresult as JSON)
from SCRIPT(
    ON(select url from sourcetab)
    SCRIPT_COMMAND('./mytestdb/urltojson.py')
    RETURNS(' JSONresult VARCHAR(10000)')
);

結果:

JSONresult
----------------------------------------------------------------------------------------
{"q": ["NYSE:TDC"]}
{"mylist": ["1", "2", "...testing"]}
{"_from": ["R40"], "_trksid": ["p2050601.m570.l1313.TR0.TRC0.H0.Xteradata merchandise"], "_nkw": ["teradata merchandise"], "_sacat": ["0"]}
{"search_query": ["teradata commercial"], "sm": ["3"]}