Problèmes connus pour Oracle NoSQL Database Analytics Integrator

Perte de précision possible avec certains types de données :

L'intégrateur d'analyse Oracle NoSQL Database extrait les données des tables dans Oracle NoSQL Database Cloud Service, les convertit au format Parquet, les stocke dans Object Storage et les transfère finalement vers une table dans une base de données ADW. Pour effectuer la conversion au format Parquet, l'intégrateur d'analyse NoSQL utilise les fonctionnalités fournies par Oracle NoSQL Database Migrator, qui met en correspondance les types de données NoSQL Oracle avec des types comparables définis par le système de type Parquet. La mise en correspondance entre le système de type de base de données NoSQL et le système de type Parquet n'est pas une mise en correspondance bi-univoque complète. Pour plus de détails, reportez-vous à Mappage de type de données Oracle NoSQL vers Parquet. En particulier, le système de type Parquet ne définit actuellement pas de type de données numérique analogue au type Oracle NoSQL NUMBER, où le type le plus grand défini par Parquet est le type DOUBLE Parquet. Ainsi, si une table NoSQL à traiter par Oracle NoSQL Database Analytics Integrator se compose d'un champ de type NUMBER qui contient une valeur si grande qu'elle ne peut pas être représentée en tant que Parquet DOUBLE, une perte de précision est possible lorsque cette valeur est convertie au type Parquet DOUBLE ; car cette valeur est représentée au format Parquet sous la forme +Infinity ou -Infinity.

La base de données ADW ne gère pas actuellement les types de champ JSON d'une longueur supérieure à 4000 octets :

Si la table que vous créez dans Oracle NoSQL Database Cloud Service contient un champ (colonne) de type JSON, et si la valeur écrite dans ce champ est un document JSON d'une longueur supérieure à 4000 octets dans au moins une ligne de la table, Bien qu'Oracle NoSQL Database Analytics Integrator n'ait aucun problème à écrire ces valeurs dans Object Storage (au format Parquet), la base de données ADW ne traite pas correctement le document JSON et affiche null au lieu du contenu du document. Bien que le paramètre d'initialisation max_string_size de la base de données ADW soit défini sur EXTENDED par défaut, le mécanisme utilisé par la base de données ADW pour extraire et afficher la valeur Parquet correspondante ignore actuellement les paramètres EXTENDED et tente de stocker la valeur dans un type VARCHAR2(4000) au lieu de VARCHAR2(32767). La valeur est alors tronquée et NULL. Pour plus d'informations, reportez-vous à Référence Oracle Database - Limites de type de données.

Exemple : créez une table myJsonTable avec deux champs, INTEGER et JSON. Supposons que vous remplissez la ligne avec id=1 avec un document JSON composé de plus de 4000 octets.
CREATE TABLE IF NOT EXISTS myJsonTable (id INTEGER, 
jsonField JSON, PRIMARY KEY (idField)) USING TTL 1 days;
Lorsque vous extrayez le contenu de la ligne dont l'ID est égal à 1, vous devez voir un résultat tel que :

SELECT * FROM myJsonTable WHERE id = '1';

id jsonField
1 (null)
Intervention : jusqu'à ce qu'ADW corrige ce bogue, vous pouvez contourner manuellement le problème en procédant comme suit à partir de l'interface SQL Database Actions.
  • Vérifiez que le paramètre d'initialisation max_string_size est défini sur EXTENDED dans la base de données.
    SELECT name,value FROM v$parameter WHERE name = 'max_string_size';
    Si la valeur de max_string_size est définie sur STANDARD, augmentez la taille de STANDARD à EXTENDED.
  • Supprimez la table 
    DROP TABLE myJsonTable;
  • Recréez manuellement la table et indiquez suffisamment d'octets pour contenir le document 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;
  • Vous devriez maintenant voir le contenu réel du document JSON sur la ligne avec id=1 .
    SELECT * FROM myJsonTable WHERE id = '1';

    Remarques :

    Plutôt que de déclarer JSONFIELD comme VARCHAR2(32767), vous pouvez également contourner ce problème en déclarant cette colonne comme type 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;

Certains clients ne gèrent pas correctement Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY et DOUBLE.NaN :

Si la table que vous créez dans Oracle NoSQL Database Cloud Service contient un champ (colonne) de type DOUBLE, et si la valeur écrite dans ce champ est Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY ou Double.NaN (non numérique) dans au moins une ligne de la table, bien que Oracle NoSQL Database Analytics Integrator n'a aucun problème à écrire ces valeurs dans Object Storage (au format Parquet). Bien que la base de données ADW n'ait aucun problème à récupérer et à stocker ces valeurs, certains clients utilisés pour analyser ces valeurs peuvent rencontrer des problèmes de gestion et/ou d'affichage de ces valeurs non numériques. Par exemple, lorsque vous tentez d'utiliser l'interface SQL Oracle Cloud Database Actions ou Oracle Analytics (Bureau ou Cloud) pour interroger la table de base de données ADW, ce problème se manifeste de deux manières.

Lorsque vous utilisez le bouton Exécuter l'instruction de l'interface SQL Database Actions (représentée par un cercle vert contenant une flèche blanche) pour exécuter une seule requête SELECT sur la table, bien que la requête soit réellement terminée, les résultats de la requête ne sont jamais affichés et la commande semble se bloquer.

Remarques :

On peut dire que la requête se termine plutôt que se bloque lors de l'utilisation de l'option Exécuter l'instruction dans l'interface SQL Database Actions lorsque la fenêtre Résultat de la requête de cette interface affiche finalement un menu déroulant libellé Télécharger et affiche le temps d'exécution (même si la molette de rotation semble indiquer que la requête est bloquée).

Il existe deux façons de résoudre ce problème. Tout d'abord, vous pouvez simplement exécuter la requête en tant que script. Pour ce faire, sélectionnez la requête dans la fenêtre [Worksheet]* de l'outil, puis cliquez sur le bouton Run Script. Les résultats de la requête s'affichent dans la fenêtre Sortie de script de l'outil. Les valeurs Double.POSITIVE_INFINITY sont affichées sous forme de chaîne "Infinity", les valeurs Double.NEGATIVE_INFINITY sous forme de chaîne "-Infinity" et les valeurs Double.NaN sous forme de chaîne "NaN".

Une autre façon de contourner le problème dans l'interface SQL Database Actions consiste à utiliser l'instruction d'exécution pour exécuter la requête et lorsque le menu déroulant Télécharger apparaît dans la requête Fenêtre de résultat (indiquant que la requête est terminée), cliquez sur le menu déroulant Télécharger et cliquez sur l'option de menu libellée JSON pour exporter la sortie de la requête en tant que document JSON. Une fois que vous avez exporté les résultats de la requête, vous pouvez utiliser le navigateur ou l'éditeur de votre choix pour examiner les résultats de la requête.

En revanche, si vous utilisez Oracle Analytics (outil de bureau ou service cloud) pour interroger la table, la trace d'erreur suivante se produit :
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"
Il n'y a aucun problème à résoudre dans Oracle Analytics.

Par conséquent, tant que l'interface SQL Database Actions et Oracle Analytics ne traitent pas la façon dont ils gèrent Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY et Double.NaN, vous devez toujours savoir si la table à analyser se compose ou non de lignes contenant une ou plusieurs de ces valeurs.