Oracle NoSQL Database Analytics Integratorの既知の問題

一部のデータ型で精度が失われる可能性があります。

Oracle NoSQL Database Analytics Integratorは、Oracle NoSQL Database Cloud Serviceの表からデータを取得し、そのデータをParquet形式に変換し、Parquetデータをオブジェクト・ストレージに格納し、最後にそのデータをADWデータベースの表に転送します。NoSQL Analytics Integratorでは、Parquet形式への変換を実行するために、Oracle NoSQL Database Migratorによって提供される機能を使用します。この機能により、Oracle NoSQLデータ型がParquet型システムによって定義された同等の型にマップされます。NoSQLデータベース・タイプ・システムとParquetタイプ・システム間のマッピングは、完全な1対1マッピングではありません。詳細は、「Oracle NoSQLからParquetデータ型へのマッピング」を参照してください。特に、Parquet型システムは現在、Oracle NoSQL NUMBER型に類似した数値データ型を定義していません。Parquetで定義される最大型はParquet DOUBLE型です。したがって、Oracle NoSQL Database Analytics Integratorによって処理されるNoSQL表がNUMBER型のフィールドで構成されていて、そのフィールドの値が大きすぎて表せない場合Parquet DOUBLEでは、その値がParquet DOUBLE型に変換されると精度が失われる可能性があります。その値はParquet形式で+Infinityまたは-Infinityとして表されるためです。

ADWデータベースは現在、4000バイトを超える長さのJSONフィールド・タイプを処理しません:

Oracle NoSQL Database Cloud Serviceで作成する表にJSON型のフィールド(列)が含まれていて、そのフィールドに書き込まれる値が、表の少なくとも1行の長さが4000バイトを超えるJSONドキュメントである場合、Oracle NoSQL Database Analytics Integratorでは、このような値をオブジェクト・ストレージ(Parquet形式)に書き込むことに問題はありませんが、ADWデータベースではJSONドキュメントが正しく処理されず、ドキュメントのコンテンツのかわりにnullが表示されます。ADWデータベースのmax_string_size初期化パラメータがデフォルトでEXTENDEDに設定されていますが、対応するParquet値を取得して表示するためにADWデータベースで使用されるメカニズムでは、現在EXTENDED設定が無視され、VARCHAR2(32767)ではなくVARCHAR2(4000)型に値が格納されようとします。これにより、値が切り捨てられ、nullが表示されます。詳細は、『Oracle Databaseリファレンス- データ型制限』を参照してください。

例: INTEGERとJSONの2つのフィールドを持つ表myJsonTableを作成します。id=1の行に4000バイトを超えるJSONドキュメントを移入するとします。
CREATE TABLE IF NOT EXISTS myJsonTable (id INTEGER, 
jsonField JSON, PRIMARY KEY (idField)) USING TTL 1 days;
id=1の行の内容をフェッチすると、次のような出力が表示されます。

SELECT * FROM myJsonTable WHERE id = '1';

id jsonField
1 (null)
回避策: ADWがこのバグを修正するまで、データベース・アクションのSQLインタフェースから次を実行して問題を手動で回避できます。
  • max_string_size初期化パラメータがデータベースでEXTENDEDに設定されていることを確認します。
    SELECT name,value FROM v$parameter WHERE name = 'max_string_size';
    max_string_sizeの値がSTANDARDに設定されている場合、サイズをSTANDARDからEXTENDEDに増やします。
  • 表を削除します
    DROP TABLE myJsonTable;
  • 表を手動で再作成し、JSONドキュメントを保持するのに十分なバイトを指定します。
    begin
    DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
    table_name =>'myJsonTable',
    credential_name =>'OCI$RESOURCE_PRINCIPAL' or
    'NOSQLADWDB001_OBJ_STORE_CREDENTIAL',
    file_uri_list =>'https://objectstorage.us-ashburn-
    1.oraclecloud.com/n/nosqldev/b/nosql-to-adw/o/myJsonTable*',
    format => '{"type":"parquet", "schema": "first"}',
    column_list =>'ID NUMBER (10), JSONFIELD VARCHAR2(32767)'
    );
    end;
  • id=1の行に JSONドキュメントの実際の内容を表示できるようになりました。
    SELECT * FROM myJsonTable WHERE id = '1';

    ノート:

    JSONFIELDをVARCHAR2(32767)として宣言するのではなく、その列をCLOB型として宣言することで、この問題を回避することもできます。
    begin
    DBMS_CLOUD.CREATE_EXTERNAL_TABLE (
    table_name =>'myJsonTable',
    credential_name =>'OCI$RESOURCE_PRINCIPAL' or
    'NOSQLADWDB001_OBJ_STORE_CREDENTIAL',
    file_uri_list =>'https://objectstorage.us-ashburn-
    1.oraclecloud.com/n/nosqldev/b/nosql-to-adw/o/myJsonTable*',
    format => '{"type":"parquet", "schema": "first"}',
    column_list =>'ID NUMBER (10), JSONFIELD CLOB'
    );
    end;

一部のクライアントでは、DOUBLE.POSITIVE_INFINITY、DOUBLE.NEGATIVE_INFINITYおよびDOUBLE.NaNが正しく処理されません。

Oracle NoSQL Database Cloud Serviceで作成する表にDOUBLE型のフィールド(列)が含まれ、そのフィールドに書き込まれる値が表の少なくとも1つの行でDOUBLE.POSITIVE_INFINITY、DOUBLE.NEGATIVE_INFINITYまたはDOUBLE.NaN (非番号)である場合、Oracle NoSQL Database AnalyticsIntegratorでは、このような値をオブジェクト・ストレージ(Parquet形式)に書き込むことは問題なく、ADWデータベースではこれらの値の取得と格納に問題はありませんが、それらの値の分析に使用されるクライアントによっては、このような数値以外の値の処理や表示に問題がある場合があります。たとえば、Oracle Cloud Database Actions SQLインタフェースまたはOracle Analytics (デスクトップまたはクラウド)を使用してADWデータベース表を問い合せようとすると、この問題は2つの方法で現れます。

データベース・アクションSQLインタフェースの「文の実行」ボタン(白い矢印を含む緑色の円で表される)を使用して表に対して単一のSELECT問合せを実行すると、問合せは実際に完了しますが、問合せの結果は表示されず、コマンドがハングしているように見えます。

ノート:

データベース・アクションのSQLインタフェースで「文の実行」オプションを使用すると、問合せが完了するのは、そのインタフェースの「問合せ結果」ウィンドウに最終的に「ダウンロード」というラベルのドロップダウン・メニューが表示され、「実行時間」が表示される場合です(問合せがハングしていることを示す回転ホイールが表示されている場合でも)。

この問題を回避する方法は2つあります。まず、問合せをスクリプトとして実行できます。これを行うには、ツールの[ワークシート]*ウィンドウで問合せを選択し、「スクリプトの実行」ボタンをクリックします。これにより、問合せの結果がツールの「スクリプト出力」ウィンドウに表示され、Double.POSITIVE_INFINITY値が文字列'Infinity'、Double.NEGATIVE_INFINITY値が文字列'-Infinity'、Double.NaN値が文字列'NaN'として表示されます。

データベース・アクションSQLインタフェースの問題を回避するもう1つの方法は、「文の実行」を使用して問合せを実行し、「ダウンロード」ドロップダウン・メニューが「問合せ」に表示される場合です「結果」ウィンドウ(問合せが完了したことを示す)で、「ダウンロード」ドロップダウン・メニューをクリックし、JSONというラベルのメニュー項目をクリックして、問合せの出力をJSONドキュメントとしてエクスポートします。問合せ結果をエクスポートしたら、任意のブラウザまたはエディタを使用して問合せ結果を確認できます。

一方、Oracle Analytics (デスクトップ・ツールまたはクラウド・サービス)を使用して表を問い合せると、次のエラー・トレースが発生します。
Odbc driver returned an error (SQLExecDirectW).
State: HY000. Code.10058. [NQODBC][SQL_STATE:HY000]
[nQSError:10058] A general error has occurred.
State: HY000. Code: 43113. [nQSError: 43113] Message returned from OBIS.
State: HY000. Code: 43119. [nQSError: 43119] Query Failed.
State: HY000. Code: 17001. [nQSError: 17001] Oracle Error code: 1722,
message: ORA-01722: invalid number at OCI call OCIStmtFetch.
State: HY000. Code: 17012. [nQSError: 17012] Bulk fetch failed. (HY000)
SQL Issued:
SET VARIABLE DISABLE_CACHE_SEED=1,
DISABLE_XSA_CACHE_SEED=1,
ENABLE_DIMENSIONALITY=1;
SELECT 0 s_0, XSA('weblogic'.'1cdbf90a-570e-4ebb-946b-5510da1b5f76').
"input"."Data"."XD" s_1,
XSA('weblogic'.'1cdbf90a-570e-4ebb-946b-5510da1b5f76').
"input"."Data"."XTCTYPE" s_2,
XSA('weblogic'.'1cdbf90a-570e-4ebb-946b-5510da1b5f76').
"input"."Data"."XTESTCASE" s_3,
FROM XSA('weblogic'.'1cdbf90a-570e-4ebb-946b-5510da1b5f76').input."Data"
Oracle Analyticsでは、この問題の回避策はありません。

したがって、データベース・アクションのSQLインタフェースおよびOracle AnalyticsがDouble.POSITIVE_INFINITY、Double.NEGATIVE_INFINITYおよびDouble.NaNの処理方法に対処するまで、分析する表がこれらの値の1つ以上を含む行で構成されているかどうかを常に記録する必要があります。