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 到 Parquet 数据类型映射。特别是,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 类型的字段(列),并且写入该字段的值是 JSON 文档,该文档的长度至少在一行中超过 4000 字节,然后,尽管 Oracle NoSQL Database Analytics Integrator 将此类值写入对象存储(采用 Parquet 格式)没有任何问题,但 ADW 数据库不会正确处理 JSON 文档;显示的是 null 而不是文档的内容。虽然默认情况下 ADW 数据库的 max_string_size 初始化参数设置为 EXTENDED,但 ADW 数据库用于检索和显示相应 Parquet 值的机制当前忽略 EXTENDED 设置,并尝试将值存储在 VARCHAR2(4000) 类型而不是 VARCHAR2(32767) 中,这会导致值被截断并显示 null。有关详细信息,请参阅 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 界面中执行以下操作来手动解决该问题。

某些客户端不处理 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 Interface 或 Oracle Analytics(桌面或云)查询 ADW 数据库表时,此问题通过两种方式进行显示。

使用 Database Actions SQL 界面上的 Run Statement(运行语句)按钮(由包含白色箭头的绿色圆圈表示)对表执行单个 SELECT 查询时,虽然查询实际完成,但不会显示查询结果,并且命令显示为挂起。

注:当数据库操作 SQL 界面中的查询结果窗口最终显示标记为下载的下拉菜单并显示执行时间(即使旋转轮显示为指明查询正在挂起)时,可以使用 Database Actions SQL 界面中的运行语句选项来指示查询已完成,而不是挂起。

有两种方法可以解决此问题。首先,您可以简单地将查询作为脚本执行。为此,您需要在工具的 [Worksheet] * 窗口中选择查询,然后单击运行脚本按钮。这将在工具的脚本输出窗口中显示查询的结果;将任何 Double.POSITIVE_INFINITY 值显示为字符串 'Infinity',将 Double.NEGATIVE_INFINITY 值显示为字符串 '-Infinity',将任何 Double.NaN 值显示为字符串 'NaN'。

在 Database Actions SQL 界面中解决问题的另一种方法是使用运行语句执行查询,以及当下载下拉菜单出现在查询中时结果窗口(指示查询已完成),单击下载下拉菜单并单击标记为 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 之前,应始终注意要分析的表是否包含具有一个或多个这些值的行。

相关主题