[小ネタ]SnowflakeのJava UDF実行環境情報を取得してみた

2021.07.01

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

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

先日、SnowflakeのPreview機能であるJava UDFsを試してみました。

このJava UDFsを試しているときに「Snowflake上では、Javaのバージョンなどはどうなっているのかな?」という点が気になったので、少し調べてみました。

注意点

今回は後述の通りに調査をしてみましたが、これはあくまで現時点での情報であり、Java UDFsもPreview機能ですので、将来的に変更される可能性が十分あります。

インラインUDFを作成して情報を取得してみる

では、情報を取得していきたいと思います。先日Java UDFsを試したときは、jarファイルを利用してUDF作成を行いましたが、今回は簡易に作成したいので、インラインコードでUDFを作成してみます。

java.lang.System#getProperties()を使ってみる

以下のようにUDFを定義して「System.getProperties()から諸々の情報を一気に取得してみよう」という作戦です。

ローカル環境で動かすと以下のように情報が取得できるコードになります。

gopherProxySet=false
awt.toolkit=sun.lwawt.macosx.LWCToolkit
java.specification.version=11
(以下略)

UDFは以下のように定義しました。

CREATE OR REPLACE FUNCTION get_properties()
RETURNS VARCHAR
LANGUAGE java
handler='TemporaryTestLibrary.getProperties'
target_path='@~/udf/TemporaryTestLibrary.jar'
as
$$
class TemporaryTestLibrary {
    public static String getProperties(){
        String properties = System.getProperties().toString();

        properties = properties.replace("{", "");
        properties = properties.replace("}", "");
        properties = properties.replace(", ", System.lineSeparator());

        return properties;
    }
}
$$;

作成できたので、呼び出してみます。

SELECT get_properties();
╒══════════════════╕                                                            
│ GET_PROPERTIES() │
╞══════════════════╡
│                  │
╘══════════════════╛
1 Row(s) produced. Time Elapsed: 0.777s

か、空っぽでした。残念…。

java.lang.System#getProperty(String key)を使ってみる

少し別のUDFを作成してもう一度試してみます。今度は個別のキー指定が必要となりますがSystem.getProperty(String key)を使ってみます。

CREATE OR REPLACE FUNCTION get_property(key VARCHAR)
RETURNS VARCHAR
LANGUAGE java
handler='TemporaryTestLibrary.getProperty'
target_path='@~/udf/TemporaryTestLibrary.jar'
as
$$
class TemporaryTestLibrary {
    public static String getProperty(String key){
        return System.getProperty(key);
    }
}
$$;

java.versionを見てみましょう。

SELECT get_property('java.version');
╒══════════════════════════════╕                                                
│ GET_PROPERTY('JAVA.VERSION') │
╞══════════════════════════════╡
│ 11.0.8                       │
╘══════════════════════════════╛
1 Row(s) produced. Time Elapsed: 1.153s

今度は取得できました!

同様にしていくつかのキーを試した結果は以下になります。

プロパティ名
java.version 11.0.8
java.vendor AdoptOpenJDK
os.name Linux
os.arch amd64
os.version 4.19.84-33.70.amzn2.x86_64

AdoptOpenJDK11.0.8が利用されているんですね。ということは、ローカルで開発するときにはこのバージョンと併せておくと無難そうです。また、OSはAmazon Linux 2のようですね。

なお、各キーと取得できる情報については、以下のドキュメントに記載があります。

おまけ

UDFを作り直すときにCREATE OR REPLACE FUNCTIONを利用しましたが、target_pathで指定したファイルが既に存在する旨の以下のエラーが発生しました。この場合は、該当ファイルを削除するか、別ファイルを指定して対処すると良さそうです。

391513 (42601): SQL compilation error: TARGET_PATH cannot point to an existing file.

まとめ

以上、SnowflakeのJava UDF実行環境情報を取得してみました。

もちろん将来的に参照できなくなる可能性もありますが、こんな感じでランタイムの情報を調べることもできたよ、というネタでした。

どなたかのお役に立てば幸いです。それでは!