0 フォロワー · 15 投稿

Java Database Connectivity(JDBC)は、プログラミング言語Javaのアプリケーションプログラミングインターフェイス(API)で、クライアントがデータベースにアクセスする方法を定義します。

質問 m.fuku · 9月 24, 2025

IRIS Communityの再インストールを行ったところ

tomcat上で動作するJavaのWEBアプリケーションから

JDBC経由でのDB接続ができなくなりました。

他のSQLクライアントツールからは問題なく接続できていますので

接続情報やDBの起動状態には問題ないと考えています。

解決策をご指導頂ければ幸いです。

■環境

IRISバージョン:IRIS_Community-2025.2.0.227.0-win_x64

JDKバージョン:11.0.28

JDBCドライバ:intersystems-jdbc-3.2.0.jar

■事前作業

ライセンス有効期限が切れてサービス起動できなくなったため、以下投稿と同様、再インストールを行っています。

https://jp.community.intersystems.com/post/iris%E3%82%A4%E3%83%B3%E3%82…

ちなみに前回利用したバージョン(IRIS_Community-2024.2.0.247.0-win_x64)では

以下エラー(messages.log)となりサービス起動できなかったため

7
0 42
記事 Hiroshi Sato · 7月 27, 2025 3m read

これは InterSystems FAQ サイトの記事です。
 

JDBCクライアントからのアクセスでエラーが発生した場合、返ってきたエラーメッセージやコンソールログ上の情報だけでは原因がよくわからない場合があります。

そのような場合にJDBCドライバのクライアントログを取得することで、エラーについての詳細情報を取得することができます。

JDBCログの取得方法については以下をご参照ください。

JDBCのログ

ログを指定する際に、ディレクトリ名を含まずに直接ファイル名を指定した場合、そのアプリケーションのディレクトリにその指定したファイル名でログが出力されます。

ODBCログの様にPID毎に取得する方法は用意されていません。

JDBCログが正常に取得できている場合、以下の様な内容が書き込まれます。

0
0 59
記事 Hiroshi Sato · 4月 2, 2025 3m read

Mac版のIRISにSQLを使用して他ツールからアクセスするケースはそもそも少ないと思いますが、DBeaverにJDBCを使用してアクセスできることはこのコミュニティの住人であれば、知っている人は結構いるかと思います。

しかし今回ちょっと理由があってMac上のIRISにODBCを使ってアクセスする方法についてトライしてみました。

ここではその備忘録を書き留めておこうと思います。

実際の所、Mac上のクライアントツールでODBCでアクセスできるツールもそんなにないのですが、

候補としてMS-Excel(MS-Query経由)またはLibreOfficeがありました。

まず結論としてExcelは色々とトライしましたが、原因不明ですがうまくつながりませんでした。

(どうもExcel(MS-Query)が拒絶している感じです)

LibreOfficeは何とか接続でき、データの取得はできる様になりました。

まず、前準備としてODBC Driver Managerというものをセットアップする必要があります。

細かくいうとこれにもiODBCとUnixODBCの2系統があるのですが、ExcelおよびLibreOfficeはiODBCにしか対応していない感じです。
(これは正確な情報ではない可能性はあります)

0
0 43
質問 Yuji Ohata · 11月 22, 2024

こんにちは、皆さま。
業務でIRISを用いて開発を行っている者です。

IRISに直接Insert文を発行する時と、JDBCを経由してInsert文を発行する時とで、
挙動差異があるように見受けれれまいたので、何かご存知な方がいらっしゃれば教えてください。

次の様なテーブルがあります。

それに対してDBeaverとIRIS管理ポータルからInsertを実行します。

★DBeaver

★IRIS管理ポータル

この後実際に作成されたグローバルの情報を確認すると、
『VARCHAR型』で作成したカラムに数値をInsertした際に、
実データの型が異なっていることがわかります。

DBeaver(JDBC) ➡ 文字列で登録
IRIS直     ➡ 数値で登録

個人的には『VARCHAR型』に数値が入ること自体がおかしいので、
DBeaverの方がまし(ホントは型違反とかになってほしい)と思うのですが、
この差異が何で発生するのか、また回避する方法をご存じな方がいらっしゃれば情報共有頂きたいです。

また、そもそもIRISはRDBを使っても型チェックが曖昧になるものなのかも気になっています。
さすがに数値のカラムに文字列を入れようとすると怒られるのですが、
上記の様な場合にチェックの仕組みが働かないのには違和感がありました。

3
0 130
記事 Megumi Kakechi · 5月 6, 2024 4m read

前回、LinuxでODBC接続を行う方法 をご紹介しました。

今回は、LinuxでJDBC接続を行う方法 をご紹介します。作業は、root ユーザ で行います。

はじめに、Linuxのバージョンを確認します。

$ cat /etc/os-release
NAME="Red Hat Enterprise Linux"
VERSION="9.4 (Plow)"
:


1. yumパッケージのアップデートを行います

$ su -
Password:
Last login: Tue May  7 01:04:35 UTC 2024 on pts/0
# yum update


2. Java をインストールします

今回は、Adoptium OpenJDK の Version 8 - LTS を使用してテストします。
※ *.tar.gz は、/usr/java 以下にダウンロードします。

#cd /usr/java# ls
OpenJDK8U-jdk_x64_linux_hotspot_8u412b08.tar.gz
# tar zxvf OpenJDK8U-jdk_x64_linux_hotspot_8u412b08.tar.gz
:
# ls
jdk8u412-b08  OpenJDK8U-jdk_x64_linux_hotspot_8u412b08.tar.gz
0
0 1245
記事 Megumi Kakechi · 9月 21, 2022 2m read

SQL ゲートウェイ接続を使用した、外部データベースへのアクセス方法についてご説明します。

手順は以下になります。
 

1. 外部ソースへの SQL ゲートウェイ接続の作成を行います

※こちらの例では、IRISの別インスタンスへの接続を試しています。 
※ODBCを使用される場合は、事前に
システムDSN(64bit)の準備が必要です。
管理ポータルより
 [システム管理] > [構成] > [接続性] > [SQLゲートウェイ接続] の 新規接続作成 ボタンをクリックします。

接続の種類を選択し、必要項目を設定します。以下のサンプルは、ODBC接続(別IRISインスタンスのDSN設定)を行っています。

     

※ODBC/JDBC 各接続定義の作成の詳細は、以下のドキュメントをご覧ください。
 JDBC 経由での SQL ゲートウェイへの接続
 ODBC 経由での SQL ゲートウェイへの接続

2. リンクテーブルウィザードを使用して、1で作成したSQLゲートウェイ接続に対してリンクテーブルを作成します

管理ポータルより
 [システムエクスプローラ] > [SQL] ページより、
  [ウィザード] > [リンクテーブル] をクリックしリンクテーブルウィザードを開きます。

 手順に従ってリンクテーブルを作成します。

0
0 616
記事 Toshihiko Minamoto · 5月 10, 2022 4m read

最近、LOAD DATA という素晴らしい新機能を使用することがありました。この記事では、初めて使用した際の体験についてお話しします。 以下の箇条書きには優先順がなく、他の評価も含まれません。 これらは、LOAD DATA コマンドを使用したときに私が気付いたことを記したものです。 また、プレビューリリースである IRIS バージョン 2021.2.0.617 を使用していることも記しておきたいと思います。 そのため、ここに記録されたことは、それ以降の IRIS バージョンに適用しない可能性があります。 それでも誰かのお役に立てるかもしれません。

1)ファイルパスはサーバー側

JDBC 経由で最初のテストを行いました。 最初に躓いたのは、ファイルとファイルパスが、当然 (^-)_ サーバー側でなければならないということです! JDBC ドライバーはクライアント側でこれを処理しません。 おそらく明確なことかもしれませんが、最初にこのことを考慮していませんでした。

2)ファイル接尾辞は関係なし

ドキュメントには、以下のように書かれています。

ファイル名には .txt または .csv(カンマ区切り値)の接尾辞が含まれていること。

私の観察では、この動作は書かれていることと異なりました。 接尾辞は無関係です。

3)ドキュメントを読もう! エラー行はどこへ?

データファイルを読み込む際に、行を間違ってしまいました。 行に問題がある場合、その行は無視されます。 これは、バックグラウンドでサイレントに処理されるため、手放しではクライアントには通知されません。 https://https//youtu.be/jm7bDK0FoiI を見た後に、問題の詳細を表示するには、%SQL_Diag.Result and %SQL_Diag.Message を確認しなければならないことに気づきました。 また、この動作は、次のページにもすでに説明されていたことに気づきました。https://docs.intersystems.com/iris20212/csp/docbook/DocBook.UI.Page.cls?KEY=RSQL_loaddata ... つまり、マニュアルを読めということですね (^_-)

表示例を以下に示します。

SELECT * FROM %SQL_Diag.Result ORDER BY createTime DESC

読み込みの errorCount 列を確認しましょう。

%SQL_Diag.Message で(行の)詳細を確認できます。

SELECT * FROM %SQL_Diag.Message ORDER BY messageTime DESC

特定の diagResult に絞り込むことができます(%SQL_Diag.Result.ID = %SQL_Diag.Message.diagResult)。

SELECT * FROM %SQL_Diag.Message
WHERE diagResult=4
ORDER BY messageTime DESC

 

4)$SYSTEM.SQL.Schema.ImportDDL は LOAD DATA 未対応

私の Openflights Dataset サンプルアプリでは、LOAD DATA ですべての外部ファイルの読み込みを試してみました。 ステートメントは、私も以前にテーブルを作成したことのあるテキスト(sql)ファイル内にバンドルされています。

$SYSTEM.SQL.Schema.ImportDDL では、読み込めないことがわかりました。

ちなみに、ImportDDL のドキュメントには、すべての SQL ステートメントに対応しているわけではないことが書かれています。 このページには、ほんの一部の SQL ステートメントが記載されています。
残念ながら、LOAD DATA はこのリストに含まれていません。ちなみに USE DATABASE についても残念ながら未対応です。

5)Unicode 処理には設定を変更

読み込み中のデータエンコードの問題を回避するには、%Java Server を次のように設定してください。-Dfile.encoding=UTF-8
詳細については、こちらの記事をご覧ください。 この問題は、次の IRIS リリースでは解消されているでしょう。

6)読み込みがエラーで停止。でもデータは読み込み済み

JDBC でデータを読み込むと、%qparsets エラーで停止します。 エラーは次のように表示されます。

Error: [SQLCODE: <-400>:<Fatal error occurred>]
[Error: <<UNDEFINED>zExecute+83^%sqlcq.OPENFLIGHTS.cls10.1 *%qparsets>]
[Location: <ServerLoop>]

でも心配はいりません。それでもデータは読み込まれています (^-^)  詳細については、こちらの記事をご覧ください。
この問題は、次の IRIS リリースでは解消されているでしょう。

Andreas

0
0 353
記事 Toshihiko Minamoto · 2月 3, 2022 12m read

キーワード: Pandasデータフレーム、IRIS、Python、JDBS

目的

PandasデータフレームはEDA(探索的データ分析)に一般的に使用されるツールです。 MLタスクは通常、データをもう少し理解することから始まります。 先週、私はKaggleにあるこちらのCovid19データセットを試していました。 基本的に、このデータは1925件の遭遇の行と231列で構成されており、タスクは、患者(1つ以上の遭遇レコードにリンク)がICUに入室するかどうかを予測するものです。 つまりこれは、いつものようにpandas.DataFrameを使用して、まず簡単にデータを確認する、通常の分類タスクです。  

現在では、IRIS IntegratedMLが提供されています。これには強力な「AutoML」のオプションに関する洗練されたSQLラッパーがあるため、従来型のMLアルゴリズムに対抗して、多様なデータフレームのステージをIRISデータベーステーブルに保存してから、IntegratedMLを実行する方法を頻繁に採用しています。  ただし、dataframe.to_sql()はまだIRISで機能しないため、実際には、ほとんどの時間を他のデータ保存手段をいじることに充てていました。 いわば、土曜の朝の楽しい朝食の時間に素敵なオムレツを作ろうとしていたのに、一日中コンロの下で、ガスとシンクの配管作業をしていたような状況です。 さて、完璧ではありませんが、数週間後に忘れてしまわないように、簡単なメモを残しておくことにします。

範囲

 IRISでdataframe.to_sql()を作成しませんでした。残念ながら、まだそこにはたどり着いていませんが、JDBC(JayDeBeApi)を介してデータフレームを動的に直接IRISに保存する簡単なPython関数をできるだけ単純かつ生の状態を維持してさくせいしました。  既知の問題(「MemoryError」)により、PyODBCではまだ機能しない可能性があります。

環境

以下のスクリプトのベースとして、単純なdocker-coposeを介したこちらのIntegratedMLテンプレートを使って、テストしています。 環境トポロジーはGitHubリポジトリに含まれます。 IRISコンテナーに接続するには、こちらのJDBC Jupyterノートブックを使用しています。 

テスト

 1. dataframe.to_sql() をエミュレートするPython関数を定義する

ノートブックのセルで以下を実行しました。

def to_sql_iris(cursor, dataFrame, tableName, schemaName='SQLUser', drop_table=False ):
&lt;span style="color:#999999;">        """"
        Dynamically insert dataframe into an IRIS table via SQL by "excutemany" 
        
        Inputs:
            cursor:      Python JDBC or PyODBC cursor from a valid and establised DB connection
            dataFrame:   Pandas dataframe
            tablename:   IRIS SQL table to be created, inserted or apended
            schemaName:  IRIS schemaName, default to "SQLUser"
            drop_table:  If the table already exsits, drop it and re-create it if True; othrewise keep it and appen 
        Output:
            True is successful; False if there is any exception.
        """&lt;/span>
        if drop_table:   
            try:                 
                curs.execute("DROP TABLE %s.%s" %(schemaName, tableName))
            except Exception:
                pass
        
        try: 
            dataFrame.columns = dataFrame.columns.str.replace("[() -]", "_")
            curs.execute(pd.io.sql.get_schema(dataFrame, tableName))
        except Exception:
            pass
        
        curs.fast_executemany = True
        cols = ", ".join([str(i) for i in dataFrame.columns.tolist()])
        wildc =''.join('?, ' * len(dataFrame.columns))
        wildc = '(' + wildc[:-2] + ')'
        sql = "INSERT INTO " + tableName + " ( " + cols.replace('-', '_') + " ) VALUES" + wildc
        #print(sql)
        curs.executemany(sql, list(dataFrame.itertuples(index=False, name=None)) )
        return True

基本的に、上記はIRISテーブルにデータフレームを動的に挿入しようとしています。 テーブルがすでに存在する場合は、完全なデータフレームがその最後にアペンドされますが、存在しない場合は、データフレームの次元(列名と列の型)に基づく新しいテーブルが作成され、その全コンテンツが挿入されます。  executemanyメソッドを使用しているだけです。

2. テスト - 生データファイルをデータフレームに読み込む

ノートブックで以下のコードを実行し、ローカルのドライブからデータフレームに生データを読み込みます。 生データは、こちらのKaggleサイトからダウンロード可能です。

import numpy as np 
import pandas as pd 
from sklearn.impute import SimpleImputer
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, roc_auc_score, roc_curve
import seaborn as sns
sns.set(style="whitegrid")import os
for dirname, _, filenames in os.walk('./input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))
        
df = pd.read_excel("./input/raw_data_kaggle_covid_icu.xlsx")df
./input/datasets_605991_1272346_Kaggle_Sirio_Libanes_ICU_Prediction.xlsx
Out[2]:
<th>
  AGE_ABOVE65
</th>

<th>
  AGE_PERCENTIL
</th>

<th>
  GENDER
</th>

<th>
  DISEASE GROUPING 1
</th>

<th>
  DISEASE GROUPING 2
</th>

<th>
  DISEASE GROUPING 3
</th>

<th>
  DISEASE GROUPING 4
</th>

<th>
  DISEASE GROUPING 5
</th>

<th>
  DISEASE GROUPING 6
</th>

<th>
  ...
</th>

<th>
  TEMPERATURE_DIFF
</th>

<th>
  OXYGEN_SATURATION_DIFF
</th>

<th>
  BLOODPRESSURE_DIASTOLIC_DIFF_REL
</th>

<th>
  BLOODPRESSURE_SISTOLIC_DIFF_REL
</th>

<th>
  HEART_RATE_DIFF_REL
</th>

<th>
  RESPIRATORY_RATE_DIFF_REL
</th>

<th>
  TEMPERATURE_DIFF_REL
</th>

<th>
  OXYGEN_SATURATION_DIFF_REL
</th>

<th>
  WINDOW
</th>

<th>
  ICU
</th>
<td>
</td>

<td>
  1
</td>

<td>
  60th
</td>

<td>
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  1.0
</td>

<td>
  1.0
</td>

<td>
  ...
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  0-2
</td>

<td>
</td>
<td>
</td>

<td>
  1
</td>

<td>
  60th
</td>

<td>
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  1.0
</td>

<td>
  1.0
</td>

<td>
  ...
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  2-4
</td>

<td>
</td>
<td>
</td>

<td>
  1
</td>

<td>
  60th
</td>

<td>
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  1.0
</td>

<td>
  1.0
</td>

<td>
  ...
</td>

<td>
  NaN
</td>

<td>
  NaN
</td>

<td>
  NaN
</td>

<td>
  NaN
</td>

<td>
  NaN
</td>

<td>
  NaN
</td>

<td>
  NaN
</td>

<td>
  NaN
</td>

<td>
  4-6
</td>

<td>
</td>
<td>
</td>

<td>
  1
</td>

<td>
  60th
</td>

<td>
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  1.0
</td>

<td>
  1.0
</td>

<td>
  ...
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  NaN
</td>

<td>
  NaN
</td>

<td>
  NaN
</td>

<td>
  NaN
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  6-12
</td>

<td>
</td>
<td>
</td>

<td>
  1
</td>

<td>
  60th
</td>

<td>
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  1.0
</td>

<td>
  1.0
</td>

<td>
  ...
</td>

<td>
  -0.238095
</td>

<td>
  -0.818182
</td>

<td>
  -0.389967
</td>

<td>
  0.407558
</td>

<td>
  -0.230462
</td>

<td>
  0.096774
</td>

<td>
  -0.242282
</td>

<td>
  -0.814433
</td>

<td>
  ABOVE_12
</td>

<td>
  1
</td>
<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>

<td>
  ...
</td>
<td>
  384
</td>

<td>
</td>

<td>
  50th
</td>

<td>
  1
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  ...
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  0-2
</td>

<td>
</td>
<td>
  384
</td>

<td>
</td>

<td>
  50th
</td>

<td>
  1
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  ...
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  2-4
</td>

<td>
</td>
<td>
  384
</td>

<td>
</td>

<td>
  50th
</td>

<td>
  1
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  ...
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  4-6
</td>

<td>
</td>
<td>
  384
</td>

<td>
</td>

<td>
  50th
</td>

<td>
  1
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  ...
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  -1.000000
</td>

<td>
  6-12
</td>

<td>
</td>
<td>
  384
</td>

<td>
</td>

<td>
  50th
</td>

<td>
  1
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  1.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  0.0
</td>

<td>
  ...
</td>

<td>
  -0.547619
</td>

<td>
  -0.838384
</td>

<td>
  -0.701863
</td>

<td>
  -0.585967
</td>

<td>
  -0.763868
</td>

<td>
  -0.612903
</td>

<td>
  -0.551337
</td>

<td>
  -0.835052
</td>

<td>
  ABOVE_12
</td>

<td>
</td>
  PATIENT_VISIT_IDENTIFIER
1
2
3
4
...
1920
1921
1922
1923
1924
1925 rows × 231 columns

 

3. テスト - Python over JDBCでIRIS DBに接続する

import jaydebeapi
url = "jdbc:IRIS://irisimlsvr:51773/USER" 
driver = 'com.intersystems.jdbc.IRISDriver'
user = "SUPERUSER"
password = "SYS"
jarfile = "./intersystems-jdbc-3.1.0.jar"conn = jaydebeapi.connect(driver, url, [user, password], jarfile)
curs = conn.cursor()

4. テスト - データフレームをIRISテーブルに保存する

iris_schema = 'SQLUser'
iris_table = 'Covid19RawTableFromCSV'to_sql_iris(curs, df, iris_table, iris_schema, drop_table=True)   # save it into a new IRIS table of specified name
#to_sql_iris(curs, df, iris_table)  # append dataframe to an exsiting IRIS table

Out[4]: True

import pandas as pd
from IPython.display import displaydf2 = pd.read_sql("SELECT COUNT(*) from %s.%s" %(iris_schema, iris_table),conn)
display(df2)   
<th>
  Aggregate_1
</th>
<td>
  1925
</td>
 
0

したがって、全データが「Covid19RawTableFromCSV」というIRISテーブルに挿入されました。IRIS管理ポータルにログインすると、レコードが含まれるそのテーブルも表示されます。

5. テスト - 簡単なベンチマークを実行する

このデータフレームをたとえば10回挿入して、1つのJDBCセッションでこの基本的なCE dockerに掛かった時間を確認しましょう。

from tqdm import tqdm
import pandas as pd
import time
from IPython.display import displaystart = time.clock() 
for i in tqdm(range(0, 10)):
    to_sql_iris(curs, df, iris_table)
    
print("Total time elasped: ", time.clock()-start, " for importing total records:")
df2 = pd.read_sql("SELECT COUNT(*) from %s.%s" %(iris_schema, iris_table),conn)
display(df2)
100%|██████████| 10/10 [00:14<00:00,  1.42s/it]
Total time elasped:  12.612431999999998  for importing total records:
<th>
  Aggregate_1
</th>
<td>
  19250
</td>
 
0

 

以上です。非常に基本的ではありますが、少なくともデータ分析パイプラインに沿って操作されたデータフレームを保存し、多少本格的なMLを試すために、SQLインターフェースを介してIntegratedMLを呼び出すことができるようになりました。  

言及すべき警告: データフレームの文字列は、「オブジェクト」として解釈されることがあるため、df['column'].astype(str)などを使用して、IRISテーブルに挿入される前に文字列に変換する必要があります。  「DROP TABLE」は前のテーブルを上書きするために使用されます。 「DROP VIEW」は前のビューを削除するために使用できます。 

0
0 349
記事 Toshihiko Minamoto · 1月 6, 2022 9m read

キーワード: Python、JDBC、SQL、IRIS、Jupyterノートブック、Pandas、Numpy、および機械学習 

1. 目的

これは、デモの目的で、Jupyterノートブック内でPython 3によってIRIS JDBCドライバーを呼び出し、SQL構文でIRISデータベースインスタンスにデータを読み書きする、5分程度の簡単なメモです。 

昨年、私はCacheデータベースへのPythonバインディング(セクション4.7)について簡単に触れました。 そこで、Pythonを使ってIRISデータベースに接続し、そのデータをPandasデータフレームとNumPy配列に読み込んで通常の分析を行ってから、事前処理済みまたは正規化されたデータをML/DLパイプラインに通すためにIRISに書き込む作業においてのオプションと議論について要約しましょう。

すぐに思い浮かぶ簡単なオプションがいくつかあります。

  1.    ODBC: Python 3とネイティブSQLを使ったPyODBCを使ってはどうでしょうか?
  2.    JDBC: Python 3とネイティブSQLを使ったJayDeBeApiはどうでしょうか?
  3.    Spark: PySparkとSQLを使ったら?
  4.    IRIS用PythonネイティブAPI: 前に使用したCache用Pythonバイディングを拡張してみたらどうでしょうか?
  5.   IPtyhon Magic SQL %%sqlとした場合、 それはまだIRISで動作するでしょうか?

 ここで見逃されたオプションがほかにありますか?  それらも試してみたいですね。 

2. 範囲 

通常のJDBCアプローチからはじめましょう。 ODBC、Spark、PythonネイティブAPIについては、次回の簡易メモで要約することにします。 

範囲内:

このクイックデモでは、以下の一般的なコンポーネントについて触れています。

  • Anaconda
  • Jupyterノートブック 
  • Python 3
  • JayDeBeApi
  • JPyPe
  • Pandas
  • NumPy
  • IRIS 2019.xのインスタンス
  •  範囲外:

    この簡易メモでは、以下の項目には触れていません。重要な項目であり、具体的なサイトソリューション、デプロイ、およびサービスで個別に対処される可能性があります。 

  • エンドツーエンドのセキュリティ
  • 機能しないパフォーマンスなど
  • トラブルシューティングとサポート
  • ライセンス 
  • 3. デモ

    3.1 IRISインスタンスを実行する

    私は単にIRIS 2019.4コンテナーを「リモート」データベースサーバーとして実行しましたが、 適切な承認済みのアクセス権を持つIRISインスタンスであれば、どれでも使用できます。

    zhongli@UKM5530ZHONGLI MINGW64 /c/Program Files/Docker Toolbox
    $ docker ps
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                PORTS                                              NAMES
    d86be69a03ab        quickml-demo        "/iris-main"        3 days ago          Up 3 days (healthy)   0.0.0.0:9091->51773/tcp, 0.0.0.0:9092->52773/tcp   quickml

    3.2 AnacondaとJupyterノートブック

     Anacondaについてはこちらのセクション4.1に説明されたセットアップアプローチ、Jupyterノートブックについてはこちらに説明されたセットアップアプローチをノートパソコンで再利用します。  Python 3.xはこのステップでインストールされます。

    3.3 JayDeBeApiとJPyPeをインストールする

    私は自分のJupyterノートブックを起動してから、そのセルで以下を実行し、Python-to-JDBC/Javaブリッジをセットアップしました。
     
      !conda install --yes -c conda-forge jaydebeapi

    この記事の執筆時点(2020年1月)では、JeDeBeApiはJPype 0.7を使用していますが、既知のバグによって機能しないため、0.6.3にダウングレードする必要がありました。

    !conda install --yes -c conda-forge JPype1=0.6.3 --force-reinstall

    3.4 JDBC経由でIRISデータベースに接続する 

    公式のJDBCからIRISへの接続に関するドキュメントはこちらにあります。 

    JDBCでPyshon SQLを実行するには、以下のコードを例として使用しました。 このIRISインスタンスの「USER」ネームスペース内にある「DataMining.IrisDataset」というデータテーブルに接続します。 

    ### 1. Set environment variables, if necessary
    #import os
    #os.environ['JAVA_HOME']='C:\Progra~1\Java\jdk1.8.0_241'
    #os.environ['CLASSPATH'] = 'C:\interSystems\IRIS20194\dev\java\lib\JDK18\intersystems-jdbc-3.0.0.jar'
    #os.environ['HADOOP_HOME']='C:\hadoop\bin'  #winutil binary must be in Hadoop's Home
    ### 2. Get jdbc connection and cursor
    import jaydebeapi
    url = "jdbc:IRIS://192.168.99.101:9091/USER"
    driver = 'com.intersystems.jdbc.IRISDriver'
    user = "SUPERUSER"
    password = "SYS"

    #libx = "C:/InterSystems/IRIS20194/dev/java/lib/JDK18"
    jarfile = "C:/InterSystems/IRIS20194/dev/java/lib/JDK18/intersystems-jdbc-3.0.0.jar"
    conn = jaydebeapi.connect(driver, url, [user, password], jarfile)
    curs = conn.cursor()
    ### 3. specify the source data table
    dataTable = 'DataMining.IrisDataset'

     
    ### 4. Get the result and display
    curs.execute("select TOP 20 * from %s" % dataTable)
    result = curs.fetchall()
    print("Total records: " + str(len(result)))
    for i in range(len(result)):
        print(result[i])
    ### 5. CLose and clean - I keep them open for next accesses.
    #curs.close()
    #conn.close()
    Total records: 150
    (1, 1.4, 0.2, 5.1, 3.5, 'Iris-setosa')
    (2, 1.4, 0.2, 4.9, 3.0, 'Iris-setosa')
    (3, 1.3, 0.2, 4.7, 3.2, 'Iris-setosa')
    ... ...
    (49, 1.5, 0.2, 5.3, 3.7, 'Iris-setosa')
    (50, 1.4, 0.2, 5.0, 3.3, 'Iris-setosa')
    (51, 4.7, 1.4, 7.0, 3.2, 'Iris-versicolor')
    ... ... 
    (145, 5.7, 2.5, 6.7, 3.3, 'Iris-virginica')
    ... ... 
    (148, 5.2, 2.0, 6.5, 3.0, 'Iris-virginica')
    (149, 5.4, 2.3, 6.2, 3.4, 'Iris-virginica')
    (150, 5.1, 1.8, 5.9, 3.0, 'Iris-virginica')

     

    ここで、JDBCでPythonが機能していることをテストしました。 以下はちょっとした日常業務的なデータ分析と通常のMLパイプラインのプリプロセッシングであり、後のデモと比較で何度も触れる内容です。ここでは、利便的に添付しています。 

    3.5 SQL結果をPandasデータフレーム、そしてNumPy配列に変換する

    PandasとNumPyパッケージがインストールされていない場合は、上記のセクション3.3と同様に、Condaを使ってインストールします。

    次に、以下のコードを例として実行しました。

    ### transform SQL results "sqlData"to Pandas dataframe "df", then further to NumPy array "arrayN" for further ML pipelines 
    import pandas as pd
    sqlData = "SELECT * from DataMining.IrisDataset"
    df= pd.io.sql.read_sql(sqlData, conn)
    df = df.drop('ID', 1)
    df = df[['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species']]
    # set the labels to 0, 1, 2, for NumPy matrix
    df.replace('Iris-setosa', 0, inplace=True)
    df.replace('Iris-versicolor', 1, inplace=True)
    df.replace('Iris-virginica', 2, inplace=True)
    # turn dataframe into Numpy array
    arrayN = df.to_numpy()
    ### 6. CLose and clean - if connection is not needed anymore?
    #curs.close()
    #conn.close()

    いつものように現在のデータを覗いてみましょう。

    df.head(5)

    df.describe()

    データフレームと、ソースデータテーブルから正規化されたNumPy配列を取得して、使用できるようになりました。  

    もちろん、こちらのリンクのように、MLユーザーが以下のようにPython で行うような様々なルーチン分析を試して、Rを置き換えることができます。

    データソースはこちらから引用されています。

    3.6 SQLでデータを分割してIRISデータベースに書き込む

    確かに、以降でIRISの刺激的なML機能で使用できるように、データを通常どおりトレーニングセットと検証またはテストセットに分割し、一時データベーステーブルに書き込むことができます。

    import numpy as np 
    from matplotlib import pyplot
    from sklearn.model_selection import train_test_split
    # keep e.g. 20% = 30 rows as test data; trained on another e.g. 80% = 120 rows
    X = arrayN[:,0:4]
    y = arrayN[:,4]
    X_train, X_validation, Y_train, Y_validation = train_test_split(X, y, test_size=0.20, random_state=1, shuffle=True)
    # make 80% of random rows into a Train set
    labels1 = np.reshape(Y_train,(120,1))
    train = np.concatenate([X_train, labels1],axis=-1)
    # make 20% of left rows into Test set
    lTest1 = np.reshape(Y_validation,(30,1))
    test = np.concatenate([X_validation, lTest1],axis=-1)
    # write the train data set into a Pandas frame
    dfTrain = pd.DataFrame({'SepalLength':train[:, 0], 'SepalWidth':train[:, 1], 'PetalLength':train[:, 2], 'PetalWidth':train[:, 3], 'Species':train[:, 4]})
    dfTrain['Species'].replace(0, 'Iris-setosa', inplace=True)
    dfTrain['Species'].replace(1, 'Iris-versicolor', inplace=True)
    dfTrain['Species'].replace(2, 'Iris-virginica', inplace=True)
    # write the test data into another Pandas frame
    dfTest = pd.DataFrame({'SepalLength':test[:, 0], 'SepalWidth':test[:, 1], 'PetalLength':test[:, 2], 'PetalWidth':test[:, 3], 'Species':test[:, 4]})
    dfTest['Species'].replace(0, 'Iris-setosa', inplace=True)
    dfTest['Species'].replace(1, 'Iris-versicolor', inplace=True)
    dfTest['Species'].replace(2, 'Iris-virginica', inplace=True)
    ### 3. specify temp table names
    #dataTable = 'DataMining.IrisDataset'
    dtTrain = 'TRAIN02'
    dtTest = "TEST02"
    ### 4. Create 2 temporary tables - you can try drop tables then re-create them every time
    curs.execute("Create Table %s (%s DOUBLE, %s DOUBLE, %s DOUBLE, %s DOUBLE, %s VARCHAR(100))" % (dtTrain, dfTrain.columns[0], dfTrain.columns[1], dfTrain.columns[2], dfTrain.columns[3], dfTrain.columns[4]))
    curs.execute("Create Table %s (%s DOUBLE, %s DOUBLE, %s DOUBLE, %s DOUBLE, %s VARCHAR(100))" % (dtTest, dfTest.columns[0], dfTest.columns[1], dfTest.columns[2], dfTest.columns[3], dfTest.columns[4]))
    ### 5. write Train set and Test set into the tales. You can try to delete old record then insert everytime. 
    curs.fast_executemany = True
    curs.executemany( "INSERT INTO %s (SepalLength, SepalWidth, PetalLength, PetalWidth, Species) VALUES (?, ?, ?, ? ,?)" % dtTrain,
         list(dfTrain.itertuples(index=False, name=None)) )
    curs.executemany( "INSERT INTO %s (SepalLength, SepalWidth, PetalLength, PetalWidth, Species) VALUES (?, ?, ?, ? ,?)" % dtTest,
         list(dfTest.itertuples(index=False, name=None)) )
    ### 6. CLose and clean - if connection is not needed anymore?
    #curs.close()
    #conn.close()

    ここで、IRIS管理コンソールまたはターミナルSQLコンソールに切り替えると、120行のTRAIN02と30行のTEST02という2つの一次テーブルが作成されているのがわかります。

    この記事は非常に短い簡易メモを目的としているため、本内容はここまでとします。

    4. 警告

    • 上記のコンテンツは変更または改善される場合があります。 

    5. 今後の内容

    簡易メモを貢献していただける方がいらっしゃらなければ、セクション3.3と3.4をPyODBC、PySPark、およびIRIS用PythonネイティブAPIに置き換えることにします。貢献していただけるのであれば、大感謝です。

    0
    0 1014
    記事 Hiroshi Sato · 8月 24, 2021 2m read

    これは InterSystems FAQ サイトの記事です。
    インターシステムズでは、お客様のペースで学ぶことができる柔軟でユーザセントリックな教育サービスを提供しています。
    ラーン&プレイ

    InterSystems オンラインラーニングにご登録いただくと、Java から InterSystems IRISにアクセスする様々なサンプルをご利用いただけます。

    Java のサンプルは、オンラインラーニングの以下のページでご紹介しています(英語のみ)。
    Welcome to the Java QuickStart!

    オンラインラーニングサービスアカウントのない方のために、簡単に手順をご紹介します。
    ※詳細については、上記オンラインラーニングサービスページをご覧ください。

    0
    0 295
    記事 Megumi Kakechi · 6月 3, 2021 5m read

    これは InterSystems FAQ サイトの記事です。


    Java のプログラムで $List 構造のデータを扱うには、InterSystems 製品が提供する IRISList クラスを使用することが可能です。

    こちらは、IRIS Native と同様に JDBCドライバの拡張機能の一部として提供しております。

    Native API for Java Quick Reference(英語のみ)
     

    こちらでは、InterSystems 製品上に $List 構造を扱うクラスメソッドを作成し、それをストアドプロシージャとして公開し Java から呼び出すサンプルをご紹介します。


    【使用可能バージョン】

    IRIS 2020.1 以降に同梱されている JDBC ドライババージョン 3.1.0 以降。
    ただし、JDBCで使用する場合は 3.2.0以降(IRIS2021.1以降)。

    <IRISインストールディレクトリ>\dev\java\lib\JDK(Ver.)\intersystems-jdbc-3.1.0.jar


    【手順】

    0
    0 1595
    記事 Mihoko Iijima · 2月 5, 2021 5m read

    これは InterSystems FAQ サイトの記事です。

    Java ゲートウェイを使用することで、Java クラスのモジュールを InterSystems IRIS から実行できます。

    【メモ】Java ゲートウェイは、外部 Java オブジェクトを InterSystems IRIS 内のネイティブ・オブジェクトと同じようにインスタンス化し、Javaオブジェクトを操作するための方法です。

    詳細は以下ドキュメントをご参照ください。
    Java ゲートウェイについて

    Java ゲートウェイを使用する手順は以下の通りです。

    1) Java ゲートウェイサーバを開始する

    2) プロキシオブジェクト(ダイナミック・プロキシ・オブジェクト)を作成して Java オブジェクトを操作する

    1) Java ゲートウェイサーバを開始する

    Java ゲートウェイサーバを開始する方法は 3 種類あります。以下のいずれかの方法で、Java ゲートウェイサーバを開始します。

    A) 管理ポータルの「オブジェクトゲートウェイ」を利用する

    B) プロダクションにJavaゲートウェイサービスを追加する

    C) java コマンドを使用する

    A)~C) の方法は以下の通りです。

    A) 管理ポータルの「オブジェクトゲートウェイ」を利用する

    0
    0 497
    お知らせ Mihoko Iijima · 9月 13, 2020

    開発者の皆さんこんにちは!IRIS プログラミングコンテストも 6 回目を迎えました!

    今回のコンテストのテーマは

    「InterSystems IRIS をバックエンドとし Web またはモバイル・ソリューションをフロントエンドとして使用する⚡️フル・スタック・アプリケーション⚡️」

    です。日本からのご応募お待ちしております!

    Open Exchange(アプリケーション登録/参考となる開発テンプレート)のページはこちら➡ ⚡️ InterSystems Full Stack Contest ⚡️

    応募期間は 2020年9月21日~10月4日 です!

    (投票期間は 2020年10月5日~11日、勝者発表は 10月12日を予定しています)

    優勝特典

    1、審査員から多く票を集めたアプリケーションには、以下の賞金が贈られます。

    🥇 1位 - $2,000 

    🥈 2位 - $1,000 

    🥉 3位 - $500

    2、Developer Community で多く票を集めたソリューションには、以下の賞金が贈られます。

    🥇 1位 - $1,000 

    🥈 2位 - $500 

    複数の参加者が同数の票を獲得した場合、全参加者が勝者となり賞金は勝者間で分配されます。

    参加資格

    どなたでもご参加いただけます!(InterSystems 開発者コミュニティのアカウントを作成するだけでご応募いただけます)

    コンテストのスケジュール

    1
    0 325
    お知らせ Mihoko Iijima · 9月 15, 2020

    開発者の皆さん、こんにちは!

    Full Stack コンテストについての続報をお伝えします!

    投票期間に追加ポイントを獲得できる「テクノロジーボーナス」について紹介します。

    対象となる技術は、以下の通りです。

    • InterSystems IRIS REST API の使用
    • InterSystems Native API の使用
    • InterSystems JDBC の使用
    • ZPMパッケージによる公開
    • Docker コンテナの使用

    詳細は以下の通りです。

    InterSystems IRIS REST API の使用 - 1 point

    フルスタック・アプリケーションから、REST API 経由で InterSystems IRIS にアクセスるとボーナスポイントを獲得できます。REST API をご自身で開発されるか、組み込みのものを利用したり、ZPM 経由でインストールするなど、選択できます。

    RESTサービス作成方法については、ドキュメントや IRIS で作成する REST サーバの仕組み をご参照ください。

    InterSystems Native API の使用 - 1 point

    0
    0 185