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 資料庫類型系統與 Parquet 類型系統之間的對應不是完整的一對一對應。請參閱 Oracle NoSQL to Parquet Data Type Mapping 以瞭解詳細資訊。特別是,Parquet 類型系統目前並未定義類似 Oracle NoSQL NUMBER 類型的數值資料類型;Parquet 定義的最大類型是 Parquet DOUBLE 類型。因此,如果要由 Oracle NoSQL Database Analytics Integrator 處理的 NoSQL 表格是由類型為 NUMBER 的欄位所組成,該欄位包含一個值,因此無法以 NUMBER 表示。Parquet DOUBLE,當該值轉換為 Parquet DOUBLE 類型時,可能會失去精確度;因為該值將以 Parquet 格式表示為 +Infinity 或 -Infinity。
ADW 資料庫目前未處理長度較大 4000 個位元組的 JSON 欄位類型:
如果您在 Oracle NoSQL Database Cloud Service 中建立的表格包含 JSON 類型的欄位 (資料欄),且寫入該欄位的值是 JSON 文件,且表格中至少有一個資料列的長度大於 4000 個位元組,雖然 Oracle NoSQL Database Analytics Integrator 將這類值寫入物件儲存 (Parquet 格式) 時沒有問題,但 ADW 資料庫不會正確處理 JSON 文件;但是顯示 null 而不是文件的內容。雖然 ADW 資料庫的 max_string_size 初始化參數預設為 EXTENDED,但 ADW 資料庫用來擷取和顯示對應之 Parquet 值的機制目前會忽略 EXTENDED 設定值,並嘗試將值儲存在 VARCHAR2 (4000) 類型而非 VARCHAR2 (32767) 中,這會導致值被截斷,並顯示空值。請參閱 Oracle Database Reference - Datatype Limits 瞭解詳細資訊。
範例:建立含有兩個欄位 (INTEGER 和 JSON) 的表格 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 類型的欄位 (資料欄),且寫入該欄位的值至少在表格的一個資料列中為 Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY 或 DOUBLE.NaN (Not-a-Number),則雖然 Oracle NoSQL Database Analytics 整合器無法將這類值寫入物件儲存 (Parquet 格式),雖然 ADW 資料庫無法擷取和儲存這些值,但某些用於分析這些值的從屬端可能無法處理和 (或) 顯示這類非數值。例如,當您嘗試使用 Oracle Cloud Database Actions SQL Interface 或 Oracle Analytics (桌面或雲端) 來查詢 ADW 資料庫表格時,此問題以兩種方式自行列出。
當您使用「資料庫動作 SQL 介面」上的執行敘述句按鈕 (以包含白色箭號的綠色圓圈表示) 在表格上執行單一 SELECT 查詢時,雖然查詢實際完成,但查詢的結果永遠不會顯示,而且命令似乎停滯。
注意:當該介面的查詢結果視窗最後顯示一個標示為下載的下拉式功能表,並顯示執行時間 (即使顯示微調操控盤來指示查詢停滯) 時,使用者可以指示查詢完成而非停滯。
您可以透過兩種方式解決此問題。首先,您只要以命令檔的形式執行查詢即可。若要這麼做,請在工具的 [Worksheet] * 視窗中選取查詢,然後按一下執行命令檔按鈕。這會在工具的命令檔輸出視窗中顯示查詢的結果;將任何 Double.POSITIVE_INFINITY 值顯示為字串 'Infinity'、Double.NEGATIVE_INFINITY 值作為字串 '-Infinity' 和任何 Double.NaN 值作為字串 'NaN'。
Another way to work around the issue in the Database Actions SQL Interface is to use the Run Statement to execute the query, and when the Download dropdown menu appears in the Query Result window (indicating the query has completed), click on the Download dropdown menu and click on the menu item labeled JSON to export the output of the query as a JSON document. 匯出查詢結果之後,您可以使用瀏覽器或選擇的編輯器來檢查查詢結果。
另一方面,如果您使用 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 的方式之前,您應該記下要分析的表格是否包含具有一或多個這些值的任何資料列。