この記事は公開されてから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 |
AdoptOpenJDK
の11.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実行環境情報を取得してみました。
もちろん将来的に参照できなくなる可能性もありますが、こんな感じでランタイムの情報を調べることもできたよ、というネタでした。
どなたかのお役に立てば幸いです。それでは!