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 데이터베이스가 현재 길이가 4,000바이트보다 큰 JSON 필드 유형을 처리하지 않음:
Oracle NoSQL Database Cloud Service에서 생성하는 테이블에 JSON 유형의 필드(열)가 포함되어 있고 해당 필드에 기록된 값이 테이블의 하나 이상의 행에서 길이가 4000바이트를 초과하는 JSON 문서인 경우 Oracle NoSQL Database Analytics Integrator가 이러한 값을 Object Storage(Parquet 형식)에 쓰는 데 문제가 없지만 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(Not-a-Number)인 경우 Oracle NoSQL Database Analytics 통합기는 이러한 값을 Parquet 형식으로 Object Storage에 쓰는 데 문제가 없으며, ADW 데이터베이스에서 이러한 값을 검색하고 저장하는 데 문제가 없지만 이러한 값을 분석하는 데 사용되는 일부 클라이언트는 이러한 비숫자 값을 처리 및/또는 표시하는 데 문제가 있을 수 있습니다. 예를 들어, Oracle Cloud Database Actions SQL Interface 또는 Oracle Analytics(데스크탑 또는 클라우드)를 사용하여 ADW 데이터베이스 테이블을 질의하려고 시도하면 이 문제는 두 가지 방법으로 나타납니다.
Database Actions SQL Interface(흰색 화살표가 포함된 녹색 원으로 표시됨)에서 Run Statement 단추를 사용하여 테이블에 대한 단일 SELECT 질의를 실행할 때 질의가 실제로 완료되었지만 질의 결과가 표시되지 않고 명령이 중단된 것으로 나타납니다.
주: 해당 인터페이스의 질의 결과 창에 결국 다운로드라는 드롭다운 메뉴가 표시되고 실행 시간이 표시될 때 해당 인터페이스의 실행 명령문 옵션을 사용할 때 질의가 중단되지 않고 질의가 완료됨을 알 수 있습니다(조회가 중단되었음을 나타내는 회전 휠이 표시되더라도).
이 문제를 해결하는 방법에는 두 가지가 있습니다. 먼저 query를 스크립트로 실행하면 됩니다. 이렇게 하려면 도구의 [워크시트]* 창에서 질의를 선택한 다음 스크립트 실행 단추를 누릅니다. 그러면 툴의 스크립트 출력 창에 질의 결과가 표시됩니다. Double.POSITIVE_INFINITY 값을 문자열 'Infinity', Double.NEGATIVE_INFINITY 값을 문자열 '-Infinity'로, Double.NaN 값을 문자열 'NaN'으로 표시합니다.
Another way to work around the issue in the Database Actions SQL Interface is to use the Run Statement to execute the query, and when the Download dropdown menu appears in the Query Result window (indicating the query has completed), click on the Download dropdown menu and click on the menu item labeled JSON to export the output of the query as a JSON document. 조회 결과를 내보낸 후에는 브라우저 또는 편집기를 사용하여 조회 결과를 검사할 수 있습니다.
반면, 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을 처리하는 방법을 다룰 때까지는 분석하려는 테이블이 이러한 값 중 하나 이상이 있는 행으로 구성되는지 여부를 항상 기록해야 합니다.