Problèmes connus liés à l'intégrateur d'analyses d'Oracle NoSQL Database
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, convertit ces données au format Parquet, stocke les données Parquet dans le stockage d'objets et transfère finalement ces données vers une table d'une base de données ADW. Pour effectuer la conversion au format Parquet, NoSQL Analytics Integrator utilise les fonctions fournies par l'outil de migration d'Oracle NoSQL Database, qui mappe 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 base de données NoSQL et le système de type Parquet n'est pas un mappage complet un à un. 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, où le plus grand type 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 en tant que Parquet DOUBLE, alors une perte de précision est possible lorsque cette valeur est convertie au type Parquet DOUBLE; car cette valeur sera représentée au format Parquet comme +Infinity ou -Infinity.
La base de données ADW ne traite 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, bien que l'intégrateur d'analyses d'Oracle NoSQL Database n'ait aucun problème pour écrire de telles valeurs dans le stockage d'objets (au format Parquet), la base de données ADW ne traite pas correctement le document JSON; 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 la troncature de la valeur et l'affichage d'une valeur nulle. Pour plus de détails, voir Informations de référence sur Oracle Database - Limites de type de données.
Exemple : Créez une table myJsonTable avec deux champs, INTEGER et 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 une sortie telle que :
SELECT * FROM myJsonTable WHERE id = '1';
id jsonField
1 (null)
Solution de rechange : Jusqu'à ce que ADW corrige ce bogue, vous pouvez résoudre 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_sizeest 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_sizeest 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 le champ 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 (Not-a-Number) dans au moins une rangée de la table, alors 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 et/ou d'affichage de telles valeurs non numériques. Par exemple, lorsque vous tentez d'utiliser l'interface SQL d'Oracle Cloud Database Actions ou Oracle Analytics (Desktop ou Cloud) 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 des actions de base de données (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 soit réellement terminée, les résultats de l'interrogation ne sont jamais affichés et la commande semble être bloquée.
Note : On peut dire que l'interrogation se termine plutôt que se bloque lorsque l'option Exécuter l'énoncé de l'interface SQL d'Actions de base de données est utilisée lorsque la fenêtre Résultat de l'interrogation de cette interface affiche finalement un menu déroulant étiqueté Télécharger et affiche le temps d'exécution (même si la roue tournante semble indiquer que l'interrogation est suspendue).
Il existe 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, vous devez sélectionner l'interrogation dans la fenêtre [Feuille de calcul]* de l'outil, puis cliquer sur le bouton Exécuter le script. Les résultats de l'interrogation s'affichent dans la fenêtre Sortie de script de l'outil. Les valeurs Double.POSITIVE_INFINITY sont affichées en tant que chaîne 'Infinity', Double.NEGATIVE_INFINITY en tant que chaîne '-Infinity', et les valeurs Double.NaN en tant que chaîne 'NaN'.
Une autre façon de contourner le problème dans l'interface SQL d'Actions de base de données consiste à utiliser l'énoncé d'exécution pour exécuter l'interrogation et lorsque le menu déroulant Télécharger s'affiche dans l'interrogation Dans la fenêtre Résultat (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. Une fois les résultats de l'interrogation exportés, vous pouvez utiliser le navigateur ou l'éditeur de votre choix pour examiner les résultats de l'interrogation.
D'autre part, 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'existe aucune solution de rechange pour ce problème dans Oracle Analytics.
Ainsi, jusqu'à ce que l'interface SQL des actions de base de données et Oracle Analytics traitent la façon dont ils traitent Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY et Double.NaN, vous devez toujours indiquer si la table que vous souhaitez analyser se compose ou non de rangées comportant une ou plusieurs de ces valeurs.