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 en Oracle NoSQL Database Cloud Service, los convierte al formato Parquet, almacena los datos de Parquet en Object Storage y, por último, transfiere esos datos a una tabla en una base de datos de ADW. Para realizar la conversión al formato Parquet, NoSQL Analytics Integrator emplea las funciones proporcionadas por Oracle NoSQL Database Migrator, que asigna los tipos de datos NoSQL de Oracle a tipos similares 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 de uno a uno. Consulte Asignación del tipo de dato 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 NoSQL NUMBER de Oracle; 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 Parquet DOUBLE, entonces es posible una pérdida de precisión cuando ese valor se convierte al tipo Parquet DOUBLE; ya que ese valor se representará en formato Parquet como +Infinity o -Infinity.

ADW Database no maneja actualmente tipos de campos JSON de longitud de más de 4000 bytes:

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 continuación, aunque Oracle NoSQL Database Analytics Integrator no tiene problemas para escribir estos valores en Object Storage (en formato Parquet), la base de datos ADW no procesa el documento JSON correctamente; muestra nulo en lugar del contenido del documento. Aunque el parámetro de inicialización max_string_size de la base de datos de ADW está definido en EXTENDED por defecto, el mecanismo utilizado por la base de datos de 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 Referencia de Oracle Database: límites de tipo de dato 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)
Solución alternativa: hasta que ADW corrija 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_size esté 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_size está 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';

    Note:

    En lugar de declarar 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 DOUBLE y si el valor escrito en ese campo es Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY o Double.NaN (No es un número) en al menos una fila de la tabla, aunque Oracle NoSQL Database Analytics Integrator 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 maneras.

Al utilizar el botón Ejecutar Sentencia de la interfaz SQL de Database Actions (representado por un círculo verde que contiene una flecha blanca) para ejecutar una sola consulta SELECT en la tabla, aunque la consulta se complete realmente, los resultados de la consulta nunca se mostrarán y el comando parece bloquearse.

Note:

Se puede saber que la consulta se completa en lugar de bloquearse cuando se utiliza 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 parezca indicar que la consulta está bloqueada).

Hay dos formas de solucionar este problema. 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; los valores de Double.POSITIVE_INFINITY se mostrarán como la cadena 'Infinity', los valores de Double.NEGATIVE_INFINITY como la cadena '-Infinity' y los valores de 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 Descargar en Consulta Ventana Resultado (que indica que la consulta ha finalizado), haga clic en el menú desplegable Descargar y en la opción de menú etiquetada como JSON para exportar la salida de la consulta como un documento JSON. Una vez exportados los resultados de la consulta, puede utilizar el explorador o 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 temporal 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, debe tomar nota siempre de si la tabla que desea analizar está formada o no por filas con uno o más de estos valores.