Problemi noti con Oracle NoSQL Database Analytics Integrator

Possibile perdita di precisione con alcuni tipi di dati:

Oracle NoSQL Database Analytics Integrator recupera i dati dalle tabelle in Oracle NoSQL Database Cloud Service, converte tali dati in formato Parquet, memorizza i dati Parquet nello storage degli oggetti e infine trasferisce tali dati in una tabella in un database ADW. Per eseguire la conversione in formato Parquet, NoSQL Analytics Integrator utilizza le funzionalità fornite da Oracle NoSQL Database Migrator, che mappa i tipi di dati NoSQL di Oracle a tipi comparabili definiti dal sistema di tipo Parquet. Il mapping tra il sistema del tipo di database NoSQL e il sistema del tipo Parquet non è un mapping uno-a-uno completo. Per ulteriori dettagli, vedere Mapping dei tipi di dati da Oracle NoSQL a Parquet. In particolare, il sistema di tipo Parquet attualmente non definisce un tipo di dati numerico analogo al tipo NoSQL NUMBER di Oracle; dove il tipo più grande definito da Parquet è il tipo Parquet DOUBLE. Pertanto, se una tabella NoSQL da elaborare da Oracle NoSQL Database Analytics Integrator è costituita da un campo di tipo NUMBER contenente un valore così grande che non può essere rappresentato come Parquet DOUBLE, quindi è possibile una perdita di precisione quando tale valore viene convertito nel tipo Parquet DOUBLE; poiché tale valore verrà rappresentato nel formato Parquet come +Infinity o -Infinity.

Il database ADW attualmente non gestisce i tipi di campo JSON di lunghezza maggiore di 4000 byte:

Se la tabella creata in Oracle NoSQL Database Cloud Service contiene un campo (colonna) di tipo JSON e se il valore scritto in tale campo è un documento JSON con lunghezza superiore a 4000 byte in almeno una riga della tabella, anche se Oracle NoSQL Database Analytics Integrator non ha problemi a scrivere tali valori nello storage degli oggetti (in formato Parquet), il database ADW non elabora correttamente il documento JSON; visualizza nullo invece del contenuto del documento. Sebbene il parametro di inizializzazione max_string_size del database ADW sia impostato su EXTENDED per impostazione predefinita, il meccanismo utilizzato dal database ADW per recuperare e visualizzare il valore Parquet corrispondente attualmente ignora le impostazioni EXTENDED e tenta di memorizzare il valore in un tipo VARCHAR2(4000) invece di VARCHAR2(32767); ciò causa il troncamento del valore e la visualizzazione di un valore nullo. Per ulteriori dettagli, vedere Oracle Database Reference - Datatype Limits.

Esempio: creare una tabella myJsonTable con due campi, INTEGER e JSON. Si supponga di popolare la riga con id=1 con un documento JSON costituito da più di 4000 byte.
CREATE TABLE IF NOT EXISTS myJsonTable (id INTEGER, 
jsonField JSON, PRIMARY KEY (idField)) USING TTL 1 days;
Quando si recupera il contenuto della riga con id=1, dovrebbe essere visualizzato un output simile al seguente:

SELECT * FROM myJsonTable WHERE id = '1';

id jsonField
1 (null)
Altre informazioni: finché ADW non corregge questo bug, è possibile risolvere manualmente il problema eseguendo le operazioni riportate di seguito dall'interfaccia SQL di Database Actions.
  • Verificare che il parametro di inizializzazione max_string_size sia impostato su EXTENDED nel database.
    SELECT name,value FROM v$parameter WHERE name = 'max_string_size';
    Se il valore di max_string_size è impostato su STANDARD, aumentare la dimensione da STANDARD a EXTENDED.
  • Eliminare la tabella
    DROP TABLE myJsonTable;
  • Ricreare manualmente la tabella e specificare un numero di byte sufficiente per contenere il documento 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;
  • Ora dovresti essere in grado di vedere il contenuto effettivo del documento JSON nella riga con id=1 .
    SELECT * FROM myJsonTable WHERE id = '1';

    Nota

    Anziché dichiarare JSONFIELD VARCHAR2(32767) è possibile risolvere il problema dichiarando tale colonna come di tipo 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;

Alcuni client non gestiscono correttamente Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY e DOUBLE.NaN:

Se la tabella creata in Oracle NoSQL Database Cloud Service contiene un campo (colonna) di tipo DOUBLE e se il valore scritto in tale campo è Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY o Double.NaN (non numerico) in almeno una riga della tabella, anche se Oracle NoSQL Database Analytics Integrator non ha problemi a scrivere tali valori nello storage degli oggetti (in formato Parquet) e sebbene il database ADW non abbia problemi a recuperare e memorizzare tali valori, alcuni client utilizzati per analizzare tali valori potrebbero avere problemi a gestire e/o visualizzare tali valori non numerici. Ad esempio, quando si tenta di utilizzare l'interfaccia SQL di Oracle Cloud Database Actions o Oracle Analytics (Desktop o Cloud) per eseguire una query sulla tabella di database ADW, questo problema si manifesta in due modi.

Quando si utilizza il pulsante Esegui istruzione nell'interfaccia SQL di Database Actions (rappresentata da un cerchio verde contenente una freccia bianca) per eseguire una singola query SELECT sulla tabella, anche se la query viene effettivamente completata, i risultati della query non vengono mai visualizzati e il comando viene sospeso.

Nota

Si può dire che la query viene completata anziché bloccata quando si utilizza l'opzione Esegui istruzione nell'interfaccia SQL di Database Actions quando la finestra Risultato query di tale interfaccia visualizza infine un menu a discesa denominato Scarica e visualizza il tempo di esecuzione (anche se la rotella sembra indicare che la query è in sospeso).

Esistono due modi per risolvere questo problema. Per prima cosa, puoi semplicemente eseguire la query come script. A tale scopo, selezionare la query nella finestra [Worksheet]* dello strumento, quindi fare clic sul pulsante Esegui script. Verranno visualizzati i risultati della query nella finestra Output script dello strumento; verranno visualizzati eventuali valori Double.POSITIVE_INFINITY come stringa 'Infinity', valori Double.NEGATIVE_INFINITY come stringa '-Infinity' ed eventuali valori Double.NaN come stringa 'NaN'.

Un altro modo per risolvere il problema nell'interfaccia SQL di Database Actions consiste nell'utilizzare l'istruzione Esegui per eseguire la query e quando il menu a discesa Scarica viene visualizzato nella Query Finestra Risultato (che indica che la query è stata completata), fare clic sul menu a discesa Scarica e fare clic sulla voce di menu denominata JSON per esportare l'output della query come documento JSON. Dopo aver esportato i risultati della query, è possibile utilizzare il browser o l'editor preferito per esaminare i risultati della query.

D'altra parte, se si utilizza Oracle Analytics (strumento desktop o servizio cloud) per eseguire una query sulla tabella, si verifica il seguente trace di errore:
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"
In Oracle Analytics non esistono soluzioni per questo problema.

Pertanto, fino a quando l'interfaccia SQL Database Actions e Oracle Analytics non indirizzano la modalità di gestione di Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY e Double.NaN, è sempre necessario tenere presente se la tabella che si desidera analizzare è costituita da righe con uno o più di questi valori.