Oracle NoSQL Database Analytics Integrator와 관련하여 알려진 문제

일부 데이터 유형의 정밀도 손실 가능성:

Oracle NoSQL Database Analytics Integrator는 Oracle NoSQL Database Cloud Service의 테이블에서 데이터를 검색하고, 해당 데이터를 Parquet 형식으로 변환하고, Parquet 데이터를 Object Storage에 저장하고, 마지막으로 해당 데이터를 ADW 데이터베이스의 테이블로 전송합니다. Parquet 형식으로 변환을 수행하기 위해 NoSQL Analytics Integrator는 Oracle NoSQL Database Migrator가 제공하는 기능을 사용하여 Oracle NoSQL 데이터 유형을 Parquet 유형 시스템에서 정의한 비교 가능한 유형으로 매핑합니다. NoSQL 데이터베이스 유형 시스템과 Parquet 유형 시스템 간의 매핑은 완전한 일대일 매핑이 아닙니다. 자세한 내용은 Oracle NoSQL에서 Parquet 데이터 유형 매핑을 참조하십시오. 특히, Parquet 유형 시스템은 현재 Oracle NoSQL NUMBER 유형과 유사한 숫자 데이터 유형을 정의하지 않습니다. 여기서 Parquet로 정의된 가장 큰 유형은 Parquet DOUBLE 유형입니다. 따라서 Oracle NoSQL Database Analytics Integrator에서 처리할 NoSQL 테이블이 너무 큰 값을 포함하는 NUMBER 유형의 필드로 구성되므로 NUMBER 유형으로 표현할 수 없습니다. Parquet DOUBLE은 값이 Parquet DOUBLE 유형으로 변환될 때 정밀도 손실이 가능합니다. 이 값은 Parquet 형식으로 +Infinity 또는 -Infinity로 표현됩니다.

ADW 데이터베이스가 현재 길이가 4000바이트를 초과하는 JSON 필드 유형을 처리하지 않음:

Oracle NoSQL Database Cloud Service에서 생성한 테이블에 JSON 유형의 필드(열)가 포함되어 있고 해당 필드에 쓰여진 값이 테이블의 행 하나 이상에서 길이가 4000바이트보다 큰 JSON 문서인 경우 Oracle NoSQL Database Analytics Integrator가 Parquet 형식인 Object Storage에 해당 값을 쓰는 데 문제가 없지만 ADW 데이터베이스는 JSON 문서를 올바르게 처리하지 않으므로 문서 콘텐츠 대신 null을 표시합니다. ADW 데이터베이스의 max_string_size 초기화 매개변수는 기본적으로 EXTENDED로 설정되지만 ADW 데이터베이스가 해당 Parquet 값을 검색하고 표시하는 데 사용하는 방식은 현재 EXTENDED 설정을 무시하고 VARCHAR2(32767) 대신 VARCHAR2(4000) 유형에 값을 저장하려고 시도하므로 값이 잘리고 널이 표시됩니다. 자세한 내용은 Oracle Database Reference - Datatype Limits를 참조하십시오.

예: INTEGER 및 JSON의 두 필드가 있는 myJsonTable 테이블을 생성합니다. 4000바이트가 넘는 JSON 문서로 id=1로 행을 채운다고 가정해 보겠습니다.
CREATE TABLE IF NOT EXISTS myJsonTable (id INTEGER, 
jsonField JSON, PRIMARY KEY (idField)) USING TTL 1 days;
id=1인 행의 내용을 패치(fetch)하면 다음과 같은 출력이 표시됩니다.

SELECT * FROM myJsonTable WHERE id = '1';

id jsonField
1 (null)
임시해결책: ADW가 이 버그를 수정할 때까지 Database Actions SQL Interface에서 다음을 수행하여 수동으로 문제를 해결할 수 있습니다.
  • 데이터베이스에서 max_string_size 초기화 매개변수가 EXTENDED로 설정되었는지 확인합니다.
    SELECT name,value FROM v$parameter WHERE name = 'max_string_size';
    max_string_size 값이 STANDARD로 설정된 경우 STANDARD에서 EXTENDED로 크기를 늘립니다.
  • 테이블을 삭제합니다
    DROP TABLE myJsonTable;
  • 수동으로 테이블을 재생성하고 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;
  • 이제 id=1 인 행에서 JSON 문서의 실제 내용을 볼 수 있습니다.
    SELECT * FROM myJsonTable WHERE id = '1';

    주:

    JSONFIELD를 VARCHAR2(32767)로 선언하는 대신 해당 열을 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;

일부 클라이언트는 Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY 및 DOUBLE.NaN를 올바르게 처리하지 않습니다.

Oracle NoSQL Database Cloud Service에서 생성한 테이블에 DOUBLE 유형의 필드(열)가 포함되어 있고 해당 필드에 쓰여진 값이 테이블의 행 하나 이상에 있는 Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY 또는 Double.NaN(숫자 아님)인 경우 Oracle NoSQL Database Analytics Integrator는 Parquet 형식으로 Object Storage에 해당 값을 쓰는 데 문제가 없으며 ADW 데이터베이스에서 해당 값을 검색 및 저장하는 데 문제가 없지만 이러한 값을 분석하는 데 사용되는 클라이언트 중 일부는 숫자가 아닌 값을 처리 및/또는 표시하는 데 문제가 있을 수 있습니다. 예를 들어, Oracle Cloud Database Actions SQL Interface 또는 Oracle Analytics(데스크탑 또는 클라우드)를 사용하여 ADW 데이터베이스 테이블을 질의하려고 시도하면 이 문제는 두 가지 방식으로 나타납니다.

Database Actions SQL 인터페이스(흰색 화살표가 있는 녹색 원으로 표시됨)에서 Run Statement 단추를 사용하여 테이블에서 단일 SELECT 질의를 실행할 경우, 질의 결과가 표시되지 않고 명령이 중단된 것으로 나타납니다.

주:

하나는 해당 인터페이스의 질의 결과 창에 다운로드라는 드롭다운 메뉴가 표시되고 실행 시간이 표시되는 경우 데이터베이스 작업 SQL 인터페이스에서 실행 명령문 옵션을 사용할 때 질의가 중단되지 않고 완료되었음을 알 수 있습니다. 단, 회전 휠은 질의가 중단되었음을 나타냅니다.

이 문제를 해결하는 방법은 두 가지가 있습니다. 먼저 질의를 스크립트로만 실행할 수 있습니다. 이렇게 하려면 도구의 [워크시트]* 창에서 질의를 선택한 다음 스크립트 실행 단추를 누릅니다. 그러면 도구의 Script Output 창에 질의 결과가 표시됩니다. Double.POSITIVE_INFINITY 값은 문자열 'Infinity', Double.NEGATIVE_INFINITY 값은 문자열 '-Infinity'로, Double.NaN 값은 문자열 'NaN'로 표시됩니다.

Database Actions SQL 인터페이스에서 문제를 해결하는 또 다른 방법은 Run Statement를 사용하여 질의를 실행하고 Download 드롭다운 메뉴가 Query 결과 창(질의가 완료되었음을 나타냄)에서 다운로드 드롭다운 메뉴를 누르고 JSON이라는 메뉴 항목을 눌러 질의 출력을 JSON 문서로 익스포트합니다. 조회 결과를 내보낸 후에는 브라우저 또는 선택 편집기를 사용하여 조회 결과를 검사할 수 있습니다.

반면, Oracle Analytics(데스크탑 도구 또는 클라우드 서비스)를 사용하여 테이블을 질의하는 경우 다음 오류 추적이 발생합니다.
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"
Oracle Analytics에서는 이 문제에 대한 해결 방법이 없습니다.

따라서 Database Actions SQL Interface 및 Oracle Analytics가 Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY 및 Double.NaN 처리 방법을 처리할 때까지 분석할 테이블이 해당 값 중 하나 이상을 가진 행으로 구성되어 있는지 여부를 항상 기록해야 합니다.