Oracle NoSQL Database Analytics Integrator 的已知问题

某些数据类型可能导致精度降低:

Oracle NoSQL Database Analytics Integrator 从 Oracle NoSQL Database Cloud Service 中的表中检索数据,将这些数据转换为 Parquet 格式,将 Parquet 数据存储在对象存储中,最后将这些数据传输到 ADW 数据库中的表。为了执行到 Parquet 格式的转换,NoSQL Analytics Integrator 使用 Oracle NoSQL Database Migrator 提供的工具,这些工具将 Oracle NoSQL 数据类型映射到 Parquet 类型系统定义的类似类型。NoSQL 数据库类型系统与 Parquet 类型系统之间的映射不是完整的一对一映射。有关更多详细信息,请参见 Oracle NoSQL to Parquet Data Type Mapping 。特别是,Parquet 类型系统当前未定义与 Oracle NoSQL NUMBER 类型类似的数字数据类型;其中 Parquet 定义的最大类型是 Parquet DOUBLE 类型。因此,如果要由 Oracle NoSQL Database Analytics Integrator 处理的 NoSQL 表由 NUMBER 类型的字段组成,该字段包含的值如此之大以至于无法表示为 Parquet DOUBLE,当该值转换为 Parquet DOUBLE 类型时,可能会丢失精度;因为该值将以 Parquet 格式表示为 +Infinity 或 -Infinity。

ADW 数据库当前未处理大于 4000 字节的 JSON 字段类型:

如果在 Oracle NoSQL Database Cloud Service 中创建的表包含类型为 JSON 的字段(列),并且写入到该字段的值是至少一行中长度大于 4000 字节的 JSON 文档,然后,尽管 Oracle NoSQL Database Analytics Integrator 在将此类值写入对象存储时没有问题(采用语法分析格式),但 ADW 数据库不会正确处理 JSON 文档;显示 null 而不是文档的内容。虽然默认情况下 ADW 数据库的 max_string_size 初始化参数设置为 EXTENDED,但 ADW 数据库用于检索和显示相应 Parquet 值的机制当前会忽略 EXTENDED 设置,并尝试将值存储在 VARCHAR2(4000) 类型中而不是 VARCHAR2(32767);这会导致值被截断且显示为空值。有关更多详细信息,请参阅 Oracle Database Reference - Datatype Limits

示例:创建包含两个字段 myJsonTable 的表:INTEGER 和 JSON。假设您使用包含超过 4000 个字节的 JSON 文档填充 id=1 的行。
CREATE TABLE IF NOT EXISTS myJsonTable (id INTEGER, 
jsonField JSON, PRIMARY KEY (idField)) USING TTL 1 days;
提取 id=1 的行内容时,应看到以下输出:

SELECT * FROM myJsonTable WHERE id = '1';

id jsonField
1 (null)
工作:在 ADW 修复此 bug 之前,您可以通过在 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';

    注意:

    您也可以将该列声明为 CLOB 类型,而不是将 JSONFIELD 声明为 VARCHAR2(32767) 来解决此问题。
    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 集成器将这些值写入对象存储(采用 Parquet 格式)没有问题,虽然 ADW 数据库检索和存储这些值没有问题,但用于分析这些值的某些客户端可能无法处理和/或显示此类非数字值。例如,当您尝试使用 Oracle Cloud Database Actions SQL 界面或 Oracle Analytics(桌面或云)查询 ADW 数据库表时,此问题通过两种方式自行列出。

使用数据库操作 SQL 界面上的运行语句按钮(由包含白箭头的绿色圆圈表示)对表执行单个 SELECT 查询时,虽然该查询实际完成,但不会显示查询结果,命令似乎挂起。

注意:

One can tell that the query completes rather than hangs when using the Run Statement option in the Database Actions SQL Interface when the Query Result window of that interface eventually displays a dropdown menu labeled Download and displays the Execution time (even though the spinning wheel appears to indicate the query is hanging).

有两种方法可以解决此问题。首先,您可以简单地以脚本形式执行查询。为此,您可以在工具的 [Worksheet]* 窗口中选择查询,然后单击运行脚本按钮。这将在工具的脚本输出窗口中显示查询的结果;将任何 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 之前,应始终注意要分析的表是否包含具有一个或多个这些值的任何行。