Oracle NoSQL Database Analytics Integratorの既知の問題
一部のデータ型で精度が低下している可能性があります:
Oracle NoSQL Database Analytics Integratorは、Oracle NoSQL Database Cloud Serviceの表からデータを取得し、そのデータをParquet形式に変換し、Parquetデータをオブジェクト・ストレージに格納し、最後にそのデータをADWデータベースの表に転送します。Parquet形式への変換を実行するために、NoSQL Analytics Integratorでは、Oracle NoSQL Database Migratorによって提供される機能が使用されます。これにより、Oracle NoSQLデータ型がParquetタイプ・システムによって定義された同等の型にマップされます。NoSQL Databaseタイプ・システムと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でこのバグが修正されるまで、Database Actions SQL Interfaceから次を実行して、手動で問題を回避できます。
-
データベースで
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タイプのフィールド(列)が含まれ、そのフィールドに書き込まれる値がDouble.POSITIVE_INFINITY、Double.NEGATIVE_INFINITYまたはDOUBLE.NaN (Not-a-Number)の場合、Oracle NoSQL Database AnalyticsIntegratorは、このような値をオブジェクト・ストレージ(Parquet形式)に書き込むことに問題はありません。ADWデータベースでは、これらの値の取得および格納に問題はありませんが、それらの値の分析に使用される一部のクライアントでは、このような数値以外の値の処理または表示(あるいはその両方)に問題がある可能性があります。たとえば、Oracle Cloud Database Actions SQL InterfaceまたはOracle Analytics (デスクトップまたはクラウド)を使用してADWデータベース表を問い合せようとすると、この問題は2つの方法で現れます。
データベース・アクションSQLインタフェースの「文の実行」ボタン(白い矢印を含む緑色の円で表されます)を使用して、表に対して単一のSELECT問合せを実行すると、問合せは実際に完了しますが、問合せの結果は表示されず、コマンドがハングしているように見えます。
ノート:データベース・アクションSQLインタフェースで「文の実行」オプションを使用すると、そのインタフェースの「問合せ結果」ウィンドウに最終的に「ダウンロード」というラベルのドロップダウン・メニューが表示され、「実行時間」(問合せがハングしていることを示すスピン・ホイールが表示されている場合でも)が表示されると、問合せはハングするのではなく完了することがわかります。
この問題を回避するには、2つの方法があります。まず、問合せをスクリプトとして実行できます。これを行うには、ツールの[ワークシート]*ウィンドウで問合せを選択し、「スクリプトの実行」ボタンをクリックします。これにより、ツールの「スクリプト出力」ウィンドウに問合せの結果が表示され、Double.POSITIVE_INFINITY値が文字列'Infinity'、Double.NEGATIVE_INFINITY値が文字列'-Infinity'として表示され、Double.NaN値が文字列'NaN'として表示されます。
データベース・アクションSQLインタフェースで問題を回避する別の方法は、「文の実行」を使用して問合せを実行し、「ダウンロード」ドロップダウン・メニューが「問合せ」に表示される場合です「結果」ウィンドウ(問合せが完了したことを示す)で、「ダウンロード」ドロップダウン・メニューをクリックし、「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つ以上の行で構成されているかどうかは常にノートにとっておく必要があります。