Problemas conhecidos com o Oracle NoSQL Database Analytics Integrator

Possível Perda de Precisão com Alguns Tipos de Dados:

O Oracle NoSQL Database Analytics Integrator recupera dados de tabelas no Oracle NoSQL Database Cloud Service, converte esses dados no formato Parquet, armazena os dados Parquet no Object Storage e finalmente transfere esses dados para uma tabela em um banco de dados do ADW. Para realizar a conversão para o formato Parquet, o NoSQL Analytics Integrator emprega recursos fornecidos pelo Oracle NoSQL Database Migrator, que mapeia tipos de dados do Oracle NoSQL para tipos comparáveis definidos pelo sistema do tipo Parquet. O mapeamento entre o sistema de tipo de Banco de Dados NoSQL e o sistema de tipo Parquet não é um mapeamento um para um completo. Consulte Mapeamento de Tipo de Dados Oracle NoSQL para Parquet para obter mais detalhes. Especificamente, o sistema do tipo Parquet atualmente não define um tipo de dados numérico análogo ao tipo NÚMERO NoSQL da Oracle; em que o maior tipo definido por Parquet é o tipo DUPLO de Parquet. Portanto, se uma tabela NoSQL a ser processada pelo Oracle NoSQL Database Analytics Integrator consistir em um campo do tipo NUMBER que contenha um valor tão grande que não possa ser representado como um Parquet DOUBLE, então uma perda de precisão é possível quando esse valor é convertido para o tipo Parquet DOUBLE; como esse valor será representado no formato Parquet como +Infinity ou -Infinity.

O banco de dados ADW atualmente não manipula tipos de campo JSON de tamanho maior que 4000 bytes:

Se a tabela criada no Oracle NoSQL Database Cloud Service contiver um campo (coluna) do tipo JSON e se o valor gravado nesse campo for um documento JSON com tamanho superior a 4000 bytes em pelo menos uma linha da tabela, então, embora o Oracle NoSQL Database Analytics Integrator não tenha problemas em gravar esses valores no Object Storage (no formato Parquet), o banco de dados ADW não processa o documento JSON corretamente; exibindo nulo em vez do conteúdo do documento. Embora o parâmetro de inicialização max_string_size do banco de dados ADW seja definido como EXTENDED por padrão, o mecanismo usado pelo banco de dados ADW para recuperar e exibir o valor Parquet correspondente atualmente ignora as definições EXTENDED e tenta armazenar o valor em um tipo VARCHAR2(4000) em vez de VARCHAR2(32767); o que faz com que o valor seja truncado e nulo seja exibido. Consulte Oracle Database Reference - Limites de Tipo de Dados para obter mais detalhes.

Exemplo: Crie uma tabela myJsonTable com dois campos, um INTEGER e um JSON. Suponha que você preencha a linha com id=1 com um documento JSON que consiste em mais de 4000 bytes.
CREATE TABLE IF NOT EXISTS myJsonTable (id INTEGER, 
jsonField JSON, PRIMARY KEY (idField)) USING TTL 1 days;
Ao extrair o conteúdo da linha com id=1, você deverá ver uma saída como a seguinte:

SELECT * FROM myJsonTable WHERE id = '1';

id jsonField
1 (null)
Trabalhar ao Redor: Até que o ADW corrija esse bug, você pode contornar manualmente o problema fazendo o seguinte na Interface SQL do Database Actions.
  • Verifique se o parâmetro de inicialização max_string_size está definido como EXTENDED no banco de dados.
    SELECT name,value FROM v$parameter WHERE name = 'max_string_size';
    Se o valor de max_string_size for definido como STANDARD, aumente o tamanho de STANDARD para EXTENDED.
  • Elimine a tabela
    DROP TABLE myJsonTable;
  • Recrie manualmente a tabela e especifique bytes suficientes para armazenar o 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;
  • Agora você deverá ser capaz de ver o conteúdo real do documento JSON na linha com id=1 .
    SELECT * FROM myJsonTable WHERE id = '1';

    Observação:

    Em vez de declarar o JSONFIELD como VARCHAR2(32767), você também pode contornar esse problema declarando essa coluna 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;

Alguns Clientes Não Tratam Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY e DOUBLE.NaN Corretamente:

Se a tabela criada no Oracle NoSQL Database Cloud Service contiver um campo (coluna) do tipo DUPLO e se o valor gravado nesse campo for DOUBLE.POSITIVE_INFINITY, DOUBLE.NEGATIVE_INFINITY ou DOUBLE.NaN (Não Número) em pelo menos uma linha da tabela, embora o Oracle NoSQL Database Analytics O integrador não tem problema em gravar esses valores no Object Storage (no formato Parquet) e, embora o banco de dados do ADW não tenha problema em recuperar e armazenar esses valores, alguns dos clientes usados para analisar esses valores podem ter problemas em lidar e/ou exibir esses valores não numéricos. Por exemplo, quando você tenta usar a Interface SQL do Oracle Cloud Database Actions ou o Oracle Analytics (Desktop ou Cloud) para consultar a tabela de banco de dados ADW, esse problema se manifesta de duas maneiras.

Quando você usa o botão Executar Instrução na Interface SQL do Database Actions (representada por um círculo verde contendo uma seta branca) para executar uma única consulta SELECT na tabela, embora a consulta realmente seja concluída, os resultados da consulta nunca são exibidos e o comando parece travar.

Observação:

Pode-se dizer que a consulta é concluída em vez de travar ao usar a opção Executar Instrução na Interface SQL do Database Actions quando a janela Resultado da Consulta dessa interface exibe um menu suspenso rotulado como Download e exibe o Tempo de execução (mesmo que a roda giratória pareça indicar que a consulta está suspensa).

Existem duas maneiras de contornar esse problema. Primeiro, você pode simplesmente executar a consulta como um script. Para fazer isso, selecione a consulta na janela [Planilha]* da ferramenta e clique no botão Executar Script. Isso exibirá os resultados da consulta na janela Saída do Script da ferramenta; exibindo quaisquer valores Double.POSITIVE_INFINITY como a string 'Infinito', valores Double.NEGATIVE_INFINITY como a string '-Infinito' e quaisquer valores Double.NaN como a string 'NaN'.

Outra maneira de resolver o problema na Interface SQL do Database Actions é usar a Instrução Executar para executar a consulta e quando o menu drop-down Download aparece na Consulta Janela Resultado (indicando que a consulta foi concluída), clique no menu drop-down Fazer Download e clique no item de menu JSON para exportar a saída da consulta como um documento JSON. Depois de exportar os resultados da consulta, você pode usar seu navegador ou editor de escolha para examinar os resultados da consulta.

Por outro lado, se você usar o Oracle Analytics (ferramenta de desktop ou serviço de nuvem) para consultar a tabela, o seguinte rastreamento de erro ocorrerá:
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"
Não há solução para esse problema no Oracle Analytics.

Assim, até que a Interface SQL do Database Actions e o Oracle Analytics abordem como eles tratam Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY e Double.NaN, você sempre deve anotar se a tabela que deseja analisar consiste ou não em qualquer linha com um ou mais desses valores.