Problèmes connus liés à l'intégrateur d'analyses d'Oracle NoSQL Database

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

Oracle NoSQL Database Analytics Integrator extrait des données des tables dans Oracle NoSQL Database Cloud Service, les convertit au format Parquet, stocke les données Parquet dans le stockage d'objets et les transfère finalement dans une table d'une base de données ADW. Pour effectuer la conversion au format Parquet, NoSQL Analytics Integrator utilise les installations fournies par Oracle NoSQL Database Migrator, qui mappent les types de données Oracle NoSQL à des types comparables définis par le système de type Parquet. Le mappage entre le système de type de base de données NoSQL et le système de type Parquet n'est pas un mappage un à un complet. Pour plus de détails, voir Mappage des types de données Oracle NoSQL à Parquet. En particulier, le système de type Parquet ne définit actuellement pas de type de données numériques analogue au type Oracle NoSQL NUMBER; le type le plus grand défini par Parquet est le type Parquet DOUBLE. Ainsi, si une table NoSQL à traiter par l'intégrateur d'analyses d'Oracle NoSQL Database se compose d'un champ de type NUMBER qui contient une valeur si grande qu'elle ne peut pas être représentée comme un Parquet DOUBLE, une perte de précision est alors possible lorsque cette valeur est convertie en type Parquet DOUBLE; car cette valeur sera représentée au format Parquet en tant que +Infinity ou -Infinity.

La base de données ADW ne gère pas actuellement les types de champ JSON de 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 dont la longueur est supérieure à 4000 octets dans au moins une rangée de la table, alors que l'intégrateur d'analyses d'Oracle NoSQL Database n'a aucun problème à écrire de telles valeurs dans le stockage d'objets (au format Parquet), la base de données ADW ne traite pas le document JSON correctement; elle affiche nul au lieu du contenu du document. Bien que le paramètre d'initialisation max_string_size de la base de données ADW soit réglé à 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), ce qui entraîne l'affichage de la valeur tronquée et de la valeur nulle. Pour plus de détails, voir Informations de référence sur Oracle Database - Limites des types de données.

Exemple : Créez une table myJsonTable avec deux champs, un INTEGER et un JSON. Supposons que vous alimentiez la rangée 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 avec id=1, vous devriez voir la sortie comme suit :

SELECT * FROM myJsonTable WHERE id = '1';

id jsonField
1 (null)
Contourner le problème : Jusqu'à ce qu'ADW corrige ce bogue, vous pouvez contourner manuellement le problème en procédant comme suit à partir de l'interface SQL de Database Actions.
  • Vérifiez que le paramètre d'initialisation max_string_size est réglé à 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 réglée à STANDARD, augmentez la taille de STANDARD à EXTENDED.
  • Supprimer la table
    DROP TABLE myJsonTable;
  • Recréez manuellement la table et spécifiez 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 pouvoir voir le contenu réel du document JSON dans la rangée avec id=1 .
    SELECT * FROM myJsonTable WHERE id = '1';

    Note :

    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 rangée de la table, bien qu'Oracle NoSQL Database Analytics L'intégrateur n'a aucun problème à écrire de telles valeurs dans le stockage d'objets (au format Parquet), et bien que la base de données ADW n'ait aucun problème à extraire et à stocker ces valeurs, certains des clients utilisés pour analyser ces valeurs peuvent avoir des problèmes de traitement ou d'affichage de ces valeurs non numériques. Par exemple, lorsque vous tentez d'utiliser l'interface SQL d'Oracle Cloud Database Actions ou Oracle Analytics (ordinateur de bureau ou nuage) pour interroger la table de base de données ADW, ce problème se manifeste de deux façons.

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

Note :

On peut dire que l'interrogation se termine plutôt que se bloque lors de l'utilisation de l'option Exécuter l'énoncé dans l'interface SQL de Database Actions lorsque la fenêtre Résultat d'interrogation de cette interface affiche finalement un menu déroulant intitulé Télécharger et affiche l'heure d'exécution (même si la roue tournante semble indiquer que l'interrogation est bloquée).

Il y a deux façons de contourner ce problème. Tout d'abord, vous pouvez simplement exécuter l'interrogation en tant que script. Pour ce faire, sélectionnez l'interrogation dans la fenêtre [Feuille de calcul]* de l'outil, puis cliquez sur le bouton Exécuter le script. Les résultats de l'interrogation seront affichés dans la fenêtre Sortie du script de l'outil; toutes les valeurs Double.POSITIVE_INFINITY seront affichées comme chaîne 'Infinity', les valeurs Double.NEGATIVE_INFINITY comme chaîne '-Infinity', et toutes les valeurs Double.NaN comme chaîne 'NaN'.

Une autre façon de contourner le problème dans l'interface SQL de Database Actions est d'utiliser l'énoncé d'exécution pour exécuter l'interrogation et lorsque le menu déroulant Télécharger apparaît dans l'interrogation Fenêtre de résultats (indiquant que l'interrogation est terminée), cliquez sur le menu déroulant Télécharger et cliquez sur l'élément de menu étiqueté JSON pour exporter la sortie de l'interrogation en tant que document JSON. Après avoir exporté les résultats de l'interrogation, vous pouvez utiliser le navigateur ou l'éditeur de votre choix pour examiner les résultats de l'interrogation.

Par contre, si vous utilisez Oracle Analytics (outil de bureau ou service en nuage) 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 moyen de contourner ce problème dans Oracle Analytics.

Ainsi, jusqu'à ce que l'interface SQL de Database Actions et Oracle Analytics traitent la façon dont ils traitent Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY et Double.NaN, vous devez toujours noter si la table que vous souhaitez analyser se compose ou non de rangées contenant une ou plusieurs de ces valeurs.