記事
· 2022年5月10日 4m read

まったく新しい LOAD DATA コマンドのコツとヒント

最近、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)2
続けるにはログインするか新規登録を行ってください