デジタル推進課

KNIME・Excel Macro・Power Automateなど日々の業務で使用できる自動化ツールを中心に書き綴ります

KNIME - Java でデータを操作する ~Java Snippet~

 

はじめに

 こんにちは、まっきーです。今回はKNIMEでJavaを使う方法をご紹介したいと思います。 

 今までKNIMEのメリットはコーディングなし(プログラミングしない)でプログラミングと同じようなことができるという説明をしてきました。 

degitalization.hatenablog.jp

 

しかし、このNodeがなくて困るんだよなーー、ってときありますよね。そして本当にない時、困りますよね。そんな時はコーディングしちゃいましょう。KNIMEは、Java, Python, R, 等 プログラミング言語を使用してデータを操作することもできます。 

※本当に仕方ない時以外コーディングは極力お勧めしません。引継ぎが大変になるからです。

  

 今回のテーマ ~Java Snippet~

 

f:id:makkynm:20201120093019p:plain

今回のテーマ - Java Snippet

 

 

Java とは?

Javaとは、プログラミング言語のひとつです。プログラミング言語の中ではかなり有名・人気な言語です。基幹システムでも稼働しています。

もっと知りたい!って方は下記のブログを参照ください。

今さら聞けない!Javaとは 【初心者向け】 | TechAcademyマガジン

f:id:makkynm:20201120093210p:plain



Snippetとは?

Javaは分かるけれどもSnippet(スニペット)って何だろうって思いますよね。

ここでいう、Snippetとは、「再利用できる部分をまとめたもの」という意味だと思います。パッケージのようなものです。

例えば、「身長と体重を入力したらBMIが出力される」というパッケージを作れば、この部分は何回も利用できるわけですから、Snippetです。

NodeはまさにSnippetそのものですね。スニペットについてもっと知りたい方は、下記のブログを参照してみてください。

スニペットって何? |【エン転職】

 

 

覚えてほしいこと

KNIMEでプログラミングをしたいときはJavaを使おう

 

やりたいこと

Javaを使うということで、残業代を複雑な計算式で計算したいときの場合を取り扱ってみたいと思います。

残業時間に応じて、残業代の時給を変えるということをやってみます。

条件1:残業時間が45時間以下の人は、時給が1000円

条件2:残業時間が60時間以下の人は、時給が2000円

条件3:それ以外の残業時間の人は、時給が3000円

f:id:makkynm:20201120092850p:plain

やりたいこと - 残業代計算をJavaでやる

 

Java Snippetの使い方

Workflow

f:id:makkynm:20201120093019p:plain

Workflow - Java Snippet

Workflowは下記からダウンロードできます。

Java Snippet – KNIME Hub

Confirm - Before After

条件によって残業代が変わっていると思います。

f:id:makkynm:20201120095654p:plain

Confirm - Java Snippet

Configure

かなりたくさんTabがありますが、今回は基礎的に使う部分のみ触れます。Configureの画面は下のようになっています。上の部分はString Manipulationに近いでしょうか。

f:id:makkynm:20201120105915p:plain

Configure - Java Snippet
Step 1 - Codeを書く

さて、早速Javaのコードを書いてみましょう。コードを書く場所は、Expression Startの下からです。

残業代は下記の式で表せますよね。

残業代 = 残業時間 × 時給

やりたいことは残業時間によって、時給を変えることでした。

条件1:残業時間が45時間以下の人は、時給が1000円

条件2:残業時間が60時間以下の人は、時給が2000円

条件3:それ以外の残業時間の人は、時給が3000円

 

これをIf文とともに書くと下記のようなコードになります。ここではJavaのコードについては解説しません。

if (c_残業時間 <= 45.0){
    out_残業代 = c_残業時間 * 1000;
} else if (45.0 < c_残業時間 && c_残業時間 <= 60.0){
    out_残業代 = c_残業時間 * 2000;
} else{
    out_残業代 = c_残業時間 * 3000;
}

 

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のそれぞれの役割・意味は下記のような形です。

  • Name:コラム名
  • Java FieldJava Snippet内で使われているコラムの名前

つまり、このInput・Outputの部分で、NameとJava Fieldがマッピングされています。

 

何が嬉しいのか?

これ、コラム名が変わったとに非常に便利なんです。例えば、先ほどの例でInputの「残業時間」というコラムの名前を「残業時間[h]」に変えたとします。

f:id:makkynm:20201120094820p:plain

コラム名を変更する

すると、コラム名が変更になっているので、JavaSnippetではエラーが発生します。

f:id:makkynm:20201120094858p:plain

Java Snippet - エラーが発生

このとき、コラム名をそのままJava Snippetのコーディング部分で使用していると、全部変えなければいけないことになります。さすがにそれは大変ですよね。

f:id:makkynm:20201120095142p:plain

コラム名に応じて名前変更は大変

そこでこのNameとJava Fieldのマッピングが役に立ちます。マッピングテーブルとして機能するので、Nameの部分を変更するだけで今まで通り動きます。

f:id:makkynm:20201120095426p:plain

マッピングテーブルとして機能

 

System imports / System variables の役割

このJava Snippet Nodeの便利なところは、Javaで儀式のように書かないといけないといけない部分を自動的に書いてくれる部分です。

Codeの部分に展開できる部分があったと思います。これを展開すると、自動的にKNIMEが書いてくれたCodeがあります。本来Javaを自分ひとりで書くときはこの部分も書かないといけませんが、KNIMEが勝手にInputやOutputに入力された情報を元にして、書くのを省略してくれてます。

もし、KNIMEが自動的に入れてくれたもの以外でimportやvariableを定義したいときは、// your custom *** のあとに記述すれば反映できます。

f:id:makkynm:20201120105643p:plain

KNIMEの自動入力機能

 

おわりに

今回はKNIMEでJavaを使ってみました。プログラミング言語を初めて見る人であれば少しびっくりしたかもしれませんが、よく知っている人であればかなり便利に使えるNodeだと思います。今後、Java Snippetを使った例も紹介していこうと思います。

ではまた!

 

 

 

余談 

 コロナまた増えてきましたね、、

なので見るだけで少し気分が楽になれる映画「マンマ・ミーア」をご紹介します。言わずと知れたミュージカル映画なので、ぜひ観たことない方はこの機会に!

 

マンマ・ミーア!(字幕版)

マンマ・ミーア!(字幕版)

  • 発売日: 2013/11/26
  • メディア: Prime Video
 
マンマ・ミーア! (吹替版)

マンマ・ミーア! (吹替版)

  • 発売日: 2013/11/26
  • メディア: Prime Video
 
マンマ・ミーア!ヒア・ウィー・ゴー (字幕版)

マンマ・ミーア!ヒア・ウィー・ゴー (字幕版)

  • 発売日: 2018/10/24
  • メディア: Prime Video
 
マンマ・ミーア!ヒア・ウィー・ゴー(吹替版)

マンマ・ミーア!ヒア・ウィー・ゴー(吹替版)

  • 発売日: 2018/12/07
  • メディア: Prime Video
 

 

 

参考リンク