はじめに
こんにちは、まっきーです。今回はKNIMEでJavaを使う方法をご紹介したいと思います。
今までKNIMEのメリットはコーディングなし(プログラミングしない)でプログラミングと同じようなことができるという説明をしてきました。
しかし、このNodeがなくて困るんだよなーー、ってときありますよね。そして本当にない時、困りますよね。そんな時はコーディングしちゃいましょう。KNIMEは、Java, Python, R, 等 プログラミング言語を使用してデータを操作することもできます。
※本当に仕方ない時以外コーディングは極力お勧めしません。引継ぎが大変になるからです。
今回のテーマ ~Java Snippet~
Java とは?
Javaとは、プログラミング言語のひとつです。プログラミング言語の中ではかなり有名・人気な言語です。基幹システムでも稼働しています。
もっと知りたい!って方は下記のブログを参照ください。
今さら聞けない!Javaとは 【初心者向け】 | TechAcademyマガジン
Snippetとは?
Javaは分かるけれどもSnippet(スニペット)って何だろうって思いますよね。
ここでいう、Snippetとは、「再利用できる部分をまとめたもの」という意味だと思います。パッケージのようなものです。
例えば、「身長と体重を入力したらBMIが出力される」というパッケージを作れば、この部分は何回も利用できるわけですから、Snippetです。
NodeはまさにSnippetそのものですね。スニペットについてもっと知りたい方は、下記のブログを参照してみてください。
覚えてほしいこと
KNIMEでプログラミングをしたいときはJavaを使おう
やりたいこと
Javaを使うということで、残業代を複雑な計算式で計算したいときの場合を取り扱ってみたいと思います。
残業時間に応じて、残業代の時給を変えるということをやってみます。
条件1:残業時間が45時間以下の人は、時給が1000円
条件2:残業時間が60時間以下の人は、時給が2000円
条件3:それ以外の残業時間の人は、時給が3000円
Java Snippetの使い方
Workflow
Workflowは下記からダウンロードできます。
Confirm - Before After
条件によって残業代が変わっていると思います。
Configure
かなりたくさんTabがありますが、今回は基礎的に使う部分のみ触れます。Configureの画面は下のようになっています。上の部分はString Manipulationに近いでしょうか。
Step 1 - Codeを書く
さて、早速Javaのコードを書いてみましょう。コードを書く場所は、Expression Startの下からです。
残業代は下記の式で表せますよね。
残業代 = 残業時間 × 時給
やりたいことは残業時間によって、時給を変えることでした。
条件1:残業時間が45時間以下の人は、時給が1000円
条件2:残業時間が60時間以下の人は、時給が2000円
条件3:それ以外の残業時間の人は、時給が3000円
これをIf文とともに書くと下記のようなコードになります。ここではJavaのコードについては解説しません。
Step2 - InputとOutputの指定方法
さて、JavaのCodeはいいですが、これをコピペしても使えません。なぜならInputとOutputが定義されていないので、out_残業代、c_残業時間 ってなんだ?とKNIMEが混乱してしまうでしょう。なので、どうやってこれを作ったかをお伝えします。
Inputの作り方
まず、Java SnippetのInputとして入ってきたコラムや変数を使う場合は、左上のColumn Listもしくは、Flow Variable Listからダブルクリックで挿入できます。
今回は残業時間のコラムを使用するので、残業時間をColumn Listからダブルクリックすると自動的にコードの部分に貼り付けされると同時に、下のInputのリストに入ります。これでc_残業時間として残業時間のコラムがInputの変数として使用できるようになりました。
Outputの作り方
Javaのコードを使って、コラムや変数を新しく作る、もしくは置き換えることができます。Outputを作りたい場合は、下のOutputという部分からAddを押して、コラム・もしくは変数、名前、データ型を選択します。
今回は「残業代」という新しいOutputのコラムを作成したいので、下のOutputのAddからコラム、コラム名、データ型を選択します。すると、expressionの部分に「out_コラム名」が出来上がるので、これを変数として計算式に入れ込みましょう。
ちょっと一言
なぜJavaなのか?
最初に覚えてほしいことで、「KNIMEでプログラミングをしたいときはJavaを使おう」と言いました。
私はKNIMEではJavaの使用をゴリ押ししています。なぜなら、環境構築が不要だからです。おそらく普通のKNIMEのNodeは裏でJavaが動いています。そのためJavaでコードを書けば、追加で何かをインストールする必要がありません。
一方、例えばPythonを使いたい場合、標準でKNIMEにInstallされていないので、別途PythonをインストールしてからKNIMEにリンクさせる必要があります。これは引継ぎが大変になってしまいますよね。自分のWorkflowを人に共有したら使えないというようなWorkflowは作るべきではないです。その点、Javaだと基本的な機能であれば追加インストール不要なので、おススメです。
NameとJava Fieldの意味
InoutやOutputの部分を見ると、NameとJava Fieldというのがあります。この違いについて理解しておきましょう。
NameとJava Fieldのそれぞれの役割・意味は下記のような形です。
つまり、このInput・Outputの部分で、NameとJava Fieldがマッピングされています。
何が嬉しいのか?
これ、コラム名が変わったとに非常に便利なんです。例えば、先ほどの例でInputの「残業時間」というコラムの名前を「残業時間[h]」に変えたとします。
すると、コラム名が変更になっているので、JavaSnippetではエラーが発生します。
このとき、コラム名をそのままJava Snippetのコーディング部分で使用していると、全部変えなければいけないことになります。さすがにそれは大変ですよね。
そこでこのNameとJava Fieldのマッピングが役に立ちます。マッピングテーブルとして機能するので、Nameの部分を変更するだけで今まで通り動きます。
System imports / System variables の役割
このJava Snippet Nodeの便利なところは、Javaで儀式のように書かないといけないといけない部分を自動的に書いてくれる部分です。
Codeの部分に展開できる部分があったと思います。これを展開すると、自動的にKNIMEが書いてくれたCodeがあります。本来Javaを自分ひとりで書くときはこの部分も書かないといけませんが、KNIMEが勝手にInputやOutputに入力された情報を元にして、書くのを省略してくれてます。
もし、KNIMEが自動的に入れてくれたもの以外でimportやvariableを定義したいときは、// your custom *** のあとに記述すれば反映できます。
おわりに
今回はKNIMEでJavaを使ってみました。プログラミング言語を初めて見る人であれば少しびっくりしたかもしれませんが、よく知っている人であればかなり便利に使えるNodeだと思います。今後、Java Snippetを使った例も紹介していこうと思います。
ではまた!
余談
コロナまた増えてきましたね、、
なので見るだけで少し気分が楽になれる映画「マンマ・ミーア」をご紹介します。言わずと知れたミュージカル映画なので、ぜひ観たことない方はこの機会に!
参考リンク
- KNIME公式Node Pit(英語):
- KNIME TV(英語):
- KNIME Example Workflow(英語):
- たまにはちょっとソフトウェア: