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 de tipos Parquet. O mapeamento entre o sistema de tipo de Banco de Dados NoSQL e o sistema de tipo Parquet não é um mapeamento completo de um para um. Consulte Mapeamento de Tipos de Dados Oracle NoSQL para Parquet para obter mais detalhes. Especificamente, o sistema do tipo Parquet não define atualmente um tipo de dados numérico análogo ao tipo NUMBER do Oracle NoSQL; onde o maior tipo definido por Parquet é o tipo DUPLO do Parquet. Assim, se uma tabela NoSQL a ser processada pelo Oracle NoSQL Database Analytics Integrator consistir em um campo do tipo NUMBER que contém um valor tão grande que não pode 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.
No momento, o Banco de Dados ADW Não Trata Tipos de Campo JSON de Bytes de Tamanho Maior: 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 maior que 4000 bytes em pelo menos uma linha da tabela, em seguida, embora o Oracle NoSQL Database Analytics Integrator não tenha problemas ao 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 esteja definido como EXTENDED por padrão, o mecanismo usado pelo banco de dados ADW para recuperar e exibir o valor Parquet correspondente ignora atualmente 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 Referência do Oracle Database - Limites do Tipo de Dados para obter mais detalhes.
Exemplo: Crie uma tabela myJsonTable com dois campos, INTEGER e 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)
Solução alternativa: até que o ADW corrija esse bug, você poderá contornar manualmente o problema fazendo o seguinte na Interface SQL do Database Actions.
-
Verifique se o parâmetro de inicialização
max_string_sizeestá definido como EXTENDED no banco de dados.SELECT name,value FROM v$parameter WHERE name = 'max_string_size';Se o valor do
max_string_sizeestiver 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ê deve poder 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 lidam com 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 DOUBLE e se o valor gravado nesse campo for Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY ou DOUBLE.NaN (Not-a-Number) 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 ADW não tenha problema em recuperar e armazenar esses valores, alguns dos clientes usados para analisar esses valores podem ter problemas para tratar 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 do ADW, esse problema se manifesta de duas maneiras.
Quando você usa o botão Executar Instrução na Interface SQL do Database Actions (representado 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 ser suspensa ao usar a opção Executar Instrução na Interface SQL do Database Actions quando a janela Resultado da Consulta dessa interface eventualmente exibe um menu drop-down com o rótulo Fazer Download e exibe o Tempo de execução (mesmo que o círculo giratório apareça para indicar que a consulta está suspensa).
Há duas maneiras de contornar esse problema. Primeiro, você pode simplesmente executar a consulta como um script. Para fazer isso, você selecionaria a consulta na janela [Planilha]* da ferramenta e, em seguida, clicaria no botão Executar Script. Isso exibirá os resultados da consulta na janela Saída de Script da ferramenta; exibindo quaisquer valores Double.POSITIVE_INFINITY como a string 'Infinity', Double.NEGATIVE_INFINITY como a string '-Infinity', e quaisquer valores Double.NaN como a string 'NaN'.
Outra maneira de contornar o problema na Interface SQL do Database Actions é usar a Instrução Executar para executar a consulta e quando o menu drop-down Fazer Download aparece na Consulta Janela Resultado (indicando que a consulta foi concluída), clique no menu drop-down Download e clique no item de menu rotulado como JSON para exportar a saída da consulta como um documento JSON. Depois de exportar os resultados da consulta, você poderá 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, ocorrerá o seguinte rastreamento de erro:
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 alternativa para esse problema no Oracle Analytics.
Assim, até que a Interface SQL do Database Actions e o Oracle Analytics resolvam como eles lidam com Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY e Double.NaN, você deve sempre observar se a tabela que deseja analisar consiste em qualquer linha com um ou mais desses valores.