Problemas conocidos de Oracle NoSQL Database Analytics Integrator
Posible pérdida de precisión con algunos tipos de datos:
Oracle NoSQL Database Analytics Integrator recupera datos de tablas de Oracle NoSQL Database Cloud Service, convierte esos datos en formato Parquet, almacena los datos de Parquet en Object Storage y, por último, transfiere esos datos a una tabla de una base de datos de almacén de datos autónomo. Para realizar la conversión al formato Parquet, NoSQL Analytics Integrator emplea las utilidades proporcionadas por Oracle NoSQL Database Migrator, que asigna tipos de dato Oracle NoSQL a tipos comparables definidos por el sistema de tipo Parquet. La asignación entre el sistema de tipo de base de datos NoSQL y el sistema de tipo Parquet no es una asignación completa uno a uno. Consulte Asignación de tipos de dato de Oracle NoSQL a Parquet para obtener más información. En concreto, el sistema de tipo Parquet no define actualmente un tipo de dato numérico análogo al tipo NUMBER de Oracle NoSQL; donde el tipo más grande definido por Parquet es el tipo Parquet DOUBLE. Por lo tanto, si una tabla NoSQL que procesará Oracle NoSQL Database Analytics Integrator consta de un campo de tipo NUMBER que contiene un valor tan grande que no se puede representar como un valor. Parquet DOBLE, entonces es posible una pérdida de precisión cuando ese valor se convierte al tipo Parquet DOBLE; ya que ese valor se representará en formato Parquet como +Infinity o -Infinity.
La base de datos de ADW no maneja actualmente tipos de campos JSON con una longitud de 4000 bytes más grande:
Si la tabla que crea en Oracle NoSQL Database Cloud Service contiene un campo (columna) de tipo JSON y si el valor escrito en ese campo es un documento JSON con una longitud superior a 4000 bytes en al menos una fila de la tabla, a pesar de que Oracle NoSQL Database Analytics Integrator no tiene ningún problema al escribir estos valores en Object Storage (en formato Parquet), la base de datos de ADW no procesa el documento JSON correctamente; muestra null en lugar del contenido del documento. Aunque el parámetro de inicialización max_string_size de la base de datos ADW está definido en EXTENDED por defecto, el mecanismo utilizado por la base de datos ADW para recuperar y mostrar el valor de Parquet correspondiente ignora actualmente la configuración EXTENDED e intenta almacenar el valor en un tipo VARCHAR2(4000) en lugar de VARCHAR2(32767); lo que hace que el valor se trunque y se muestre nulo. Consulte Oracle Database Reference - Datatype Limits para obtener más información.
Ejemplo: cree una tabla myJsonTable con dos campos, INTEGER y JSON. Supongamos que rellena la fila con id=1 con un documento JSON que consta de más de 4000 bytes.
CREATE TABLE IF NOT EXISTS myJsonTable (id INTEGER,
jsonField JSON, PRIMARY KEY (idField)) USING TTL 1 days;
Al recuperar el contenido de la fila con id=1, debería ver una salida como la siguiente:
SELECT * FROM myJsonTable WHERE id = '1';
id jsonField
1 (null)
Resolución: hasta que ADW solucione este bug, puede solucionar el problema manualmente haciendo lo siguiente desde la interfaz SQL de Database Actions.
-
Verifique que el parámetro de inicialización
max_string_sizeestá definido en EXTENDED en la base de datos.SELECT name,value FROM v$parameter WHERE name = 'max_string_size';Si el valor de
max_string_sizeestá definido en STANDARD, aumente el tamaño de STANDARD a EXTENDED. -
Borre la tabla
DROP TABLE myJsonTable; -
Vuelva a crear manualmente la tabla y especifique suficientes bytes para contener el 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; -
Ahora debería poder ver el contenido real del documento JSON en la fila con id=1 .
SELECT * FROM myJsonTable WHERE id = '1';Nota:
En lugar de declarar el JSONFIELD como VARCHAR2(32767), también puede solucionar este problema declarando esa columna como 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;
Algunos clientes no manejan Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY y DOUBLE.NaN correctamente:
Si la tabla que crea en Oracle NoSQL Database Cloud Service contiene un campo (columna) de tipo DOBLE y si el valor escrito en ese campo es Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY o DOUBLE.NaN (Not-a-Number) en al menos una fila de la tabla, aunque Oracle NoSQL Database Analytics El integrador no tiene problemas para escribir estos valores en Object Storage (en formato Parquet) y, aunque la base de datos de ADW no tiene problemas para recuperar y almacenar esos valores, algunos de los clientes utilizados para analizar esos valores pueden tener problemas para manejar y/o mostrar dichos valores no numéricos. Por ejemplo, cuando intenta utilizar la interfaz SQL de Oracle Cloud Database Actions u Oracle Analytics (escritorio o nube) para consultar la tabla de base de datos de ADW, este problema se manifiesta de dos formas.
Cuando se utiliza el botón Run Statement (Ejecutar sentencia) de la interfaz SQL de Database Actions (representada por un círculo verde que contiene una flecha blanca) para ejecutar una sola consulta SELECT en la tabla, aunque la consulta se completa realmente, los resultados de la consulta nunca se muestran y el comando parece bloquearse.
Nota: Se puede indicar que la consulta finaliza en lugar de bloquearse al utilizar la opción Ejecutar sentencia en la interfaz SQL de Database Actions cuando la ventana Resultado de consulta de esa interfaz finalmente muestra un menú desplegable con la etiqueta Descargar y muestra el tiempo de ejecución (aunque la rueda giratoria aparece para indicar que la consulta se está bloqueando).
Hay dos maneras de trabajar en torno a este tema. En primer lugar, simplemente puede ejecutar la consulta como un script. Para ello, debe seleccionar la consulta en la ventana [Hoja de Trabajo]* de la herramienta y, a continuación, hacer clic en el botón Ejecutar Script. Se mostrarán los resultados de la consulta en la ventana Salida de script de la herramienta; se mostrarán los valores Double.POSITIVE_INFINITY como la cadena 'Infinity', los valores Double.NEGATIVE_INFINITY como la cadena '-Infinity' y los valores Double.NaN como la cadena 'NaN'.
Otra forma de solucionar el problema en la interfaz SQL de Database Actions es utilizar la sentencia de ejecución para ejecutar la consulta y cuando aparezca el menú desplegable Download en la Query Ventana Result (Resultado) (que indica que la consulta ha finalizado), haga clic en el menú desplegable Download (Descargar) y haga clic en la opción de menú etiquetada como JSON para exportar la salida de la consulta como documento JSON. Una vez que haya exportado los resultados de la consulta, puede utilizar el explorador o el editor que desee para examinar los resultados de la consulta.
Por otro lado, si utiliza Oracle Analytics (herramienta de escritorio o servicio en la nube) para consultar la tabla, se produce el siguiente rastreo de errores:
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"
No hay solución para este problema en Oracle Analytics.
Por lo tanto, hasta que la interfaz SQL de Database Actions y Oracle Analytics aborden cómo manejan Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY y Double.NaN, siempre debe tomar nota de si la tabla que desea analizar está formada por filas con uno o más de estos valores.