Problèmes connus pour Oracle NoSQL Database Analytics Integrator
Perte possible de précision avec certains types de données :
Oracle NoSQL Database Analytics Integrator extrait les données des tables d'Oracle NoSQL Database Cloud Service, les convertit au format Parquet, les stocke dans Object Storage et les transfère enfin dans une table d'une base de données ADW. Pour effectuer la conversion au format Parquet, NoSQL Analytics Integrator utilise les fonctions fournies par Oracle NoSQL Database Migrator, qui met en correspondance les types de données Oracle NoSQL avec les types comparables définis par le système de type Parquet. Le mappage entre le système de type NoSQL Database et le système de type Parquet n'est pas un mappage un à un complet. Pour plus d'informations, reportez-vous à Mise en correspondance des types de données Oracle NoSQL vers Parquet. En particulier, le système de type Parquet ne définit pas actuellement 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 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, alors une perte de précision est possible lorsque cette valeur est convertie au type Parquet DOUBLE ; comme cette valeur sera représentée au format Parquet sous la forme +Infinité ou -Infinité.
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 que la valeur écrite dans ce champ est un document JSON d'une longueur supérieure à 4000 octets sur au moins une ligne de la table, alors, bien qu'Oracle NoSQL Database Analytics Integrator n'ait aucun problème pour é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), ce qui entraîne l'affichage de la valeur tronquée et de la valeur NULL. Pour plus d'informations, reportez-vous à Oracle Database Reference - Limites de type de données.
Exemple : créez une table myJsonTable avec deux champs, un INTEGER et un JSON. Supposons que vous remplissiez 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 avec id=1, vous devriez voir une sortie telle que la suivante :
SELECT * FROM myJsonTable WHERE id = '1';
id jsonField
1 (null)
Solution de contournement : jusqu'à ce qu'ADW corrige ce bogue, vous pouvez contourner manuellement le problème en effectuant les opérations suivantes à partir de l'interface SQL Database Actions.
-
Vérifiez que le paramètre d'initialisation
max_string_sizeest 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_sizeest 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 dans la ligne avec id=1 .
SELECT * FROM myJsonTable WHERE id = '1';Remarque :
Plutôt que de déclarer le 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 les paramètres 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 (Not-a-Number) dans au moins une ligne de la table, alors bien qu'Oracle NoSQL Database Analytics Integrator ne rencontre aucun problème lors de l'écriture de ces valeurs dans Object Storage (au format Parquet), et bien que la base de données ADW ne rencontre aucun problème lors de l'extraction et du stockage de ces valeurs, certains des clients utilisés pour analyser ces valeurs peuvent rencontrer des problèmes lors de la gestion et/ou de l'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 Run Statement 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 terminée, les résultats de la requête ne sont jamais affichés et la commande semble se bloquer.
Remarque : vous pouvez indiquer que la requête se termine plutôt que de se bloquer lorsque vous utilisez 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 intitulé Télécharger et affiche le temps d'exécution (même si la molette apparaît pour indiquer que la requête 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 la requête dans la fenêtre [Feuille de calcul]* de l'outil, puis cliquez sur le bouton Exécuter le script. Les résultats de la requête s'affichent dans la fenêtre Sortie du script de l'outil. Les valeurs Double.POSITIVE_INFINITY sont affichées sous la forme de la chaîne "Infinity", les valeurs Double.NEGATIVE_INFINITY sous la forme de la chaîne "-Infinity" et les valeurs Double.NaN sous la forme de la 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 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 intitulée JSON pour exporter la sortie de la requête en tant que document JSON. Une fois les résultats de la requête exportés, vous pouvez utiliser le navigateur ou l'éditeur de votre choix pour les examiner.
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'existe aucune solution de contournement pour ce problème dans Oracle Analytics.
Ainsi, jusqu'à ce que l'interface SQL Database Actions et Oracle Analytics traitent de la manière dont ils gèrent Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY et Double.NaN, vous devez toujours noter si la table que vous souhaitez analyser se compose de lignes avec une ou plusieurs de ces valeurs.