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 類型的欄位 (資料欄),而且寫入該欄位的值是表格中至少一個資料列長度大於 4000 個位元組的 JSON 文件,然後,雖然 Oracle NoSQL Database Analytics Integrator 在將這類值寫入物件儲存 (以 Parquet 格式) 時沒有問題,但是 ADW 資料庫不會正確處理 JSON 文件;顯示空值而不是文件的內容。雖然 ADW 資料庫的 max_string_size 初始化參數預設設為 EXTENDED,但 ADW 資料庫用來擷取和顯示對應 Parquet 值的機制目前會忽略 EXTENDED 設定值,並嘗試將值儲存在 VARCHAR2 (4000) 類型中,而不是 VARCHAR2 (32767);這會導致截斷值並顯示空值。如需詳細資訊,請參閱 Oracle Database Reference - 資料類型限制

範例:建立含有兩個欄位的表格 myJsonTable:INTEGER 和 JSON。假設您將 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 (非數字),則儘管 Oracle NoSQL Database Analytics 整合器無法將這類值寫入物件儲存 (以 Parquet 格式) 時發生問題,雖然 ADW 資料庫無法擷取和儲存這些值,但是部分用來分析這些值的從屬端可能無法處理和 (或) 顯示這類非數值。例如,當您嘗試使用 Oracle Cloud Database Actions SQL Interface 或 Oracle Analytics (Desktop 或 Cloud) 查詢 ADW 資料庫表格時,此問題會以兩種方式自行列出。

當您使用「資料庫動作 SQL 介面」上的執行敘述句按鈕 (以包含白色箭號的綠色圓圈表示) 在表格上執行單一 SELECT 查詢時,雖然查詢實際上已經完成,但查詢的結果永遠不會顯示,而且命令似乎停滯。

附註:

當該介面的查詢結果視窗最後顯示標示為下載的下拉式功能表,並顯示執行時間 (即使旋轉輪狀結構顯示表示查詢停滯),使用者可以指示查詢完成,而不是當使用「資料庫動作 SQL 介面」中的執行敘述句選項時當機。

您可以透過兩種方式解決此問題。首先,您只需以命令檔執行查詢即可。若要這麼做,請在工具的 [ 工作表 ]* 視窗中選取查詢,然後按一下執行命令檔按鈕。這會在工具的命令檔輸出視窗中顯示查詢結果;將任何 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 的方式之前,您應該記下要分析的表格是否包含具有一或多個這些值的任何資料列。