Amazon Redshift: UDF(User Defined Functions: ユーザー定義の独自関数)が遂にサポートされました!

2015.09.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

以前から『出るぞ出るぞ』と言われていつつ、更には我々の方でも今か今かと待ち望んでいたAmazon Redshiftの新機能、『UDF(User Defined Functions: ユーザー定義の独自関数)』がついにリリースされる運びとなる模様です。下記ブログエントリ及びTwitter関連アカウントでアナウンスがなされていましたので、早速どんな内容なのか読み解いてみたいと思います。

UDF概要:Python標準ライブラリやその他様々なライブラリの機能がRedshiftで活用可能に

この機能は、Amazon Redshiftの機能を更に拡張しつつ、利用ユーザが新しい洞察力を更に加速させる事を容易にします。PostgreSQLのシンタックス(構文)を使用して、ユースケースに対応するユーザー独自のスカラ関数(入力するひとつの値に対し、ひとつの結果を返す関数:参考)をPython2.7カスタムビルド環境を使って作成出来るようになります。

以下は、独自の関数を作るための構文です。

CREATE [ OR REPLACE ] FUNCTION f_function_name 
( [ argument_name arg_type, ... ] )
RETURNS data_type
{ VOLATILE | STABLE | IMMUTABLE }
AS $$
  python_program
$$ LANGUAGE plpythonu;

このUDFは、入力値それぞれに対して1つの結果値を返します。ROUNDSUBSTRINGの様な『組込みスカラ関数』に似たようなもの、というのがイメージしやすいでしょう。一旦定義してしまえば、組込みスカラ関数を使うのと同じような形で、あらゆるSQLステートメント内でこのUDFを使う事が出来るようになります。

独自の関数を作成する事に加えて、SQLで簡単に操作を実行するためのPythonライブラリを介して膨大な数の関数を扱う事が出来るようになります。またS3やWebから直接カスタムライブラリを追加する事が出来ます。

Amazon RedshiftのUDFはPythonの標準ライブラリやその他数多くのライブラリと組み合わせて使う事が出来るようになりました。以下は主なライブラリの例です。

  • NumPy, SciPy(Scientific Computing Tools for Python):多次元オブジェクトの作成、行列演算、最適化アルゴリズムの構築、統計分析等の数学的な機能を使う事が出来るライブラリ。
  • pandas:高レベルなデータ解析を支援する機能を提供するライブラリ。NumPyやSciPyの上に成り立っている。
  • dateutil, pytz:日付やタイムゾーン周りの操作を容易に行える機能を提供するライブラリ。

UDFの活用例:難しい操作が分かり易くシンプルな形で実行可能に

UDFは複雑な操作をシンプルにするためにも使用する事が出来ます。例えば、URLからホスト名を抽出したいというような場合であれば、以下の様に正規表現を使う事が可能となります。

SELECT
  REGEXP_REPLACE(url, '(https?)://([^@]*@)?([^:/]*)([/:].*|$)', ‘\3')
FROM
  table;

また、PythonのURL解析ライブラリ:urlparseをインポートし、ホスト名を抽出する関数を作成するといった事も可能です。

CREATE FUNCTION f_hostname(url VARCHAR)
RETURNS varchar
IMMUTABLE AS $$
import urlparse
return urlparse.urlparse(url).hostname
$$ LANGUAGE plpythonu;

このような感じで関数を作ってしまえば、以後は実にシンプルな形で処理を行う事が可能となります。これは相当数な手間が省けますね!

SELECT f_hostname(url) 
FROM table;

UDFのセキュリティ対応について

勿論Amazon Redshiftはセキュリティについても細心の注意を払っています。

UDFは完全分離された制限下でのコンテナ内部で実行されます。これはUDFがAmazon Redshiftクラスタを破壊したり、性能に悪影響を与える事が出来ないという事を意味します。

また、ファイルを書き込んだりネットワークにアクセスするような関数はサポートされていません。

この様に厳重に管理を行いつつも、UDFは最適なパフォーマンスを得るためにクラスタの各ノードで実行されているAmazon RedshiftのMPP(Massively Parallel Processor(超並列プロセッサ)の機能を活用しています。

Amazon Redshift UDFに関するリソース情報

UDFの利用可能タイミングについて

この機能、早速使ってみたい!と当然ながら思うわけですが、今すぐ使える!という訳では無さそうです。

(現在は日本時間2015/09/12(土) のAM3時ですが)今後2週間のうちに(メンテナンスウインドウの設定内容に応じて)クラスタに対してパッチが当てられ、クラスタのバージョンが1.0.991になった時点で使えるようになるとの事。

$ aws redshift describe-clusters
  --cluster-identifier xxxxxxxxxxxxx |
  jq '.Clusters[] | .ClusterVersion, .ClusterRevisionNumber'
"1.0"
"985"

手元のクラスタは残念ながらまだバージョン更新されていない様です...(´・ω・`)

まとめ

以上、Amazon RedshiftのUDF機能、待望のリリース(予定!...)というお知らせエントリでした。このUDFの機能が扱えるようになる事でビッグデータ周りのRedshift内部での処理、即ちELT(SQLによるデータ変換・加工)処理が格段に便利になります!使い方をマスターし、早速活用して行きたいところですね。Redshiftクラスタのバージョンアップが待ち遠しいです。関連ドキュメントやBlogエントリについても先行して幾つか展開されている様ですのでこちらも読み進めて理解を深めておきたいところです。こちらからは以上です。