Amazon Athenaのユーザー定義関数(UDF)のPreview版を試してみた


Amazon Athenaが遂にユーザー定義関数(UDF)をサポートするようです。
Amazon Athena Adds support for User Defined Functions (UDF)
独自に関数を作成する事で、ビルトイン関数では不可能な処理を実現できるようになります。
Preview版が公開されたので使い勝手を確かめてみました。

まとめ

USING EXTERNAL FUNCTION <function name>(col1 <type>) RETURNS <type>
LAMBDA '<lambda name>'
SELECT ...
  • 1回のLambda関数で複数のレコードがまとめて処理される為、リクエスト料金面の問題は現時点ではなさそう

Amazon Athenaとは

Amazon S3内のデータを標準SQLを用いて分析できるサービスです。

試してみた

2019/11/27現在、Preview版のUDFはus-east-1リージョンでのみ利用可能です。

UDFの作成はJava言語のAthena Query Federation SDKを用いて行います。

既存ソースコードに以下の関数を追加して、jarファイルをビルドします。

aws-athena-query-federation/athena-udfs/src/main/java/com/.../udfs/AthenaUDFHandler.java
public Long increment(Long input)
{
    System.out.println("input:" + input);
    return input + 1;
}

作成したUDF(athena-udfs-1.0.jar)をus-east-1リージョンのAWS Lambdaに登録します。

AthenaでPreview版のUDFを利用する為に、"AmazonAthenaPreviewFunctionality"という名称のワークグループを作成し、作成したワークグループに切り替えます。

以下のクエリを実行します。

USING EXTERNAL FUNCTION increment(col1 BIGINT) RETURNS BIGINT
LAMBDA 'athena_udfs_test'
SELECT v,increment(v) AS v_
FROM UNNEST(SEQUENCE(1,10000)) AS t(v)

結果

LambdaのCloudWatchログを見る限り、1回のLambda関数で多数の行がまとめて処理されている様子でした。1レコード毎にLambda関数が実行されるとリクエスト料金が跳ね上がる事を懸念していたのですが、その懸念は(あまり)なさそうです。

所感

待ちに待った機能が遂に出た、という印象です。これでビルトイン関数だけでは手が届かなかった事を実現できるようになります。
現時点での不満は、都度UDFを宣言するのに手間がかかる事でしょうか。この点は事前登録する機能が今後リリースされる事に期待します。