Bekannte Probleme mit Oracle NoSQL Database Analytics - Integrator

Möglicher Präzisionsverlust bei einigen Datentypen:

Oracle NoSQL Database Analytics Integrator ruft Daten aus Tabellen in Oracle NoSQL Database Cloud Service ab, konvertiert diese Daten in das Parquet-Format, speichert die Parquet-Daten in Object Storage und überträgt diese Daten schließlich in eine Tabelle in einer ADW-Datenbank. Um die Konvertierung in das Parquet-Format auszuführen, verwendet NoSQL Analytics Integrator vom Oracle NoSQL Database-Migrator bereitgestellte Funktionen, die Oracle NoSQL-Datentypen vergleichbaren Typen zuordnen, die vom Parquet-Typsystem definiert werden. Die Zuordnung zwischen dem Datenbanktypsystem NoSQL und dem Parquet-System ist keine vollständige Eins-zu-Eins-Zuordnung. Weitere Informationen finden Sie unter Zuordnung von Oracle NoSQL zu Parquet-Datentypen. Insbesondere definiert das Parquet-Typsystem derzeit keinen numerischen Datentyp, der dem Oracle-Typ NoSQL NUMBER entspricht. Dabei ist der von Parquet definierte größte Typ der Parquet-Typ. Wenn also eine NoSQL-Tabelle, die von Oracle NoSQL Database Analytics Integrator verarbeitet werden soll, aus einem Feld des Typs NUMBER besteht, das einen Wert enthält, der so groß ist, dass er nicht als Parquet DOUBLE, dann ist ein Verlust der Genauigkeit möglich, wenn dieser Wert in den Parquet DOUBLE-Typ konvertiert wird; da dieser Wert im Parquet-Format als +Infinity oder -Infinity dargestellt wird.

ADW-Datenbank verarbeitet derzeit keine JSON-Feldtypen mit einer Länge von mehr als 4000 Byte:

Wenn die in Oracle NoSQL Database Cloud Service erstellte Tabelle ein Feld (Spalte) des Typs JSON enthält und der in dieses Feld geschriebene Wert ein JSON-Dokument mit einer Länge von mehr als 4000 Byte in mindestens einer Zeile der Tabelle ist, Obwohl Oracle NoSQL Database Analytics Integrator keine Probleme beim Schreiben solcher Werte in Object Storage (im Parquet-Format) hat, verarbeitet die ADW-Datenbank das JSON-Dokument nicht ordnungsgemäß. Es wird anstelle des Inhalts des Dokuments null angezeigt. Obwohl der Initialisierungsparameter max_string_size der ADW-Datenbank standardmäßig auf EXTENDED gesetzt ist, ignoriert der Mechanismus, mit dem die ADW-Datenbank den entsprechenden Parquet-Wert abruft und anzeigt, derzeit die EXTENDED-Einstellungen und versucht, den Wert in einem VARCHAR2(4000)-Typ anstelle von VARCHAR2(32767) zu speichern. Dadurch wird der Wert abgeschnitten und Null angezeigt. Weitere Informationen finden Sie in der Oracle Database-Referenz - Datentyplimits.

Beispiel: Erstellen Sie eine Tabelle myJsonTable mit zwei Feldern, einem INTEGER und einem JSON. Angenommen, Sie füllen die Zeile mit id=1 mit einem JSON-Dokument aus mehr als 4000 Byte auf.
CREATE TABLE IF NOT EXISTS myJsonTable (id INTEGER, 
jsonField JSON, PRIMARY KEY (idField)) USING TTL 1 days;
Wenn Sie den Inhalt der Zeile mit id=1 abrufen, sollte eine Ausgabe wie die folgende angezeigt werden:

SELECT * FROM myJsonTable WHERE id = '1';

id jsonField
1 (null)
Problemumgehung: Bis ADW diesen Bug behebt, können Sie das Problem manuell umgehen, indem Sie im SQL-Interface von Database Actions die folgenden Schritte ausführen.
  • Prüfen Sie, ob der Initialisierungsparameter max_string_size in der Datenbank auf EXTENDED gesetzt ist.
    SELECT name,value FROM v$parameter WHERE name = 'max_string_size';
    Wenn der Wert von max_string_size auf STANDARD gesetzt ist, erhöhen Sie die Größe von STANDARD auf EXTENDED.
  • Löschen Sie die Tabelle
    DROP TABLE myJsonTable;
  • Erstellen Sie die Tabelle manuell neu, und geben Sie genügend Byte für das JSON-Dokument an.
    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;
  • Sie sollten nun den tatsächlichen Inhalt des JSON-Dokuments in der Zeile mit id=1 sehen können.
    SELECT * FROM myJsonTable WHERE id = '1';

    Hinweis:

    Anstatt das JSONFIELD als VARCHAR2(32767) zu deklarieren, können Sie dieses Problem auch umgehen, indem Sie diese Spalte als CLOB deklarieren.
    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;

Einige Clients verarbeiten Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY und DOUBLE.NaN nicht korrekt:

Wenn die in Oracle NoSQL Database Cloud Service erstellte Tabelle ein Feld (Spalte) des Typs DOUBLE enthält und der in dieses Feld geschriebene Wert Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY oder Double.NaN (Not-a-Number) in mindestens einer Zeile der Tabelle lautet, obwohl Oracle NoSQL Database Analytics Integrator hat kein Problem beim Schreiben solcher Werte in Object Storage (im Parquet-Format). Obwohl die ADW-Datenbank beim Abrufen und Speichern dieser Werte kein Problem hat, können einige der Clients, die zur Analyse dieser Werte verwendet werden, Probleme bei der Verarbeitung und/oder Anzeige solcher nicht numerischer Werte haben. Beispiel: Wenn Sie versuchen, die ADW-Datenbanktabelle mit der SQL-Schnittstelle von Oracle Cloud Database Actions oder mit Oracle Analytics (Desktop oder Cloud) abzufragen, hat dieses Problem zwei Möglichkeiten.

Wenn Sie auf der SQL-Oberfläche von Database Actions mit der Schaltfläche Anweisung ausführen (dargestellt durch einen grünen Kreis mit einem weißen Pfeil) eine einzelne SELECT-Abfrage für die Tabelle ausführen, obwohl die Abfrage tatsächlich abgeschlossen ist, werden die Ergebnisse der Abfrage nie angezeigt, und der Befehl scheint zu hängen.

Hinweis:

Man kann erkennen, dass die Abfrage abgeschlossen ist und nicht hängt, wenn die Option Anweisung ausführen in der SQL-Oberfläche von Database Actions verwendet wird, wenn im Fenster Abfrageergebnis dieser Schnittstelle schließlich ein Dropdown-Menü mit der Bezeichnung Herunterladen und der Ausführungszeit angezeigt wird (auch wenn das Drehrad anzeigt, dass die Abfrage hängt).

Es gibt zwei Möglichkeiten, wie Sie dieses Problem umgehen können. Zunächst können Sie die Abfrage einfach als Skript ausführen. Dazu wählen Sie die Abfrage im Fenster [Arbeitsblatt]* des Tools aus, und klicken Sie auf die Schaltfläche Skript ausführen. Dadurch werden die Ergebnisse der Abfrage im Fenster Skriptausgabe des Tools angezeigt. Alle Double.POSITIVE_INFINITY-Werte werden als Zeichenfolge "Infinity", Double.NEGATIVE_INFINITY-Werte als Zeichenfolge "-Infinity" und alle Double.NaN-Werte als Zeichenfolge "NaN" angezeigt.

Eine weitere Möglichkeit, das Problem in der SQL-Oberfläche von Database Actions zu umgehen, besteht darin, die Abfrage mit der Anweisung ausführen auszuführen, und wenn das Dropdown-Menü Herunterladen in der Abfrage Fenster "Ergebnis" (gibt an, dass die Abfrage abgeschlossen ist), klicken Sie auf das Dropdown-Menü Herunterladen, und klicken Sie auf die Menüoption JSON, um die Ausgabe der Abfrage als JSON-Dokument zu exportieren. Nachdem Sie die Abfrageergebnisse exportiert haben, können Sie die Abfrageergebnisse mit Ihrem Browser oder Editor Ihrer Wahl prüfen.

Wenn Sie hingegen die Tabelle mit Oracle Analytics (Desktoptool oder Cloud-Service) abfragen, wird das folgende Fehlertrace ausgeführt:
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"
Dieses Problem lässt sich in Oracle Analytics nicht umgehen.

Bis die SQL-Schnittstelle von Database Actions und Oracle Analytics die Verarbeitung von Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY und Double.NaN adressieren, sollten Sie daher immer notieren, ob die zu analysierende Tabelle aus Zeilen mit einem oder mehreren dieser Werte besteht.