DBMS_CLOUD-Package - Komplexe Avro-, ORC- und Parketttypen

Beschreibung der Zuordnung komplexer Avro-, ORC- und Parquet-Datentypen zu Oracle-Datentypen

Autonomous Database unterstützt komplexe Datentypen, darunter:

  • struktur

  • Liste

  • Map

  • Vereinigungsmenge

  • Array

Wenn Sie den Quelldateityp "Avro", "ORC" oder "Parkett" angeben und die Quelldatei komplexe Spalten enthält, geben Autonomous Database-Abfragen JSON für die komplexen Spalten zurück. Dies vereinfacht die Verarbeitung von Abfrageergebnissen. Sie können die leistungsstarken JSON-Parsingfunktionen von Oracle konsistent für alle Datei- und Datentypen verwenden. In der folgenden Tabelle wird das Format für die komplexen Typen in Autonomous Database angezeigt:

Hinweis

Die komplexen Felder werden VARCHAR2-Spalten zugeordnet, und es gelten VARCHAR2-Größengrenzwerte.
Typ Parquet ORC Avro Oracle
Liste: Werteliste Auflisten Auflisten Array VARCHAR2 (JSON-Format)
Map: Liste von Objekten mit einem einzelnen Schlüssel Zuordnung Zuordnung Zuordnung VARCHAR2 (JSON-Format)
Vereinheitlichung: Werte unterschiedlichen Typs Nicht verfügbar Union Union VARCHAR2 (JSON-Format)
Objekt: Null oder mehr Schlüsselwertpaare Struct Struct Aufzeichnen VARCHAR2 (JSON-Format)

Wenn Ihre ORC-, Parquet- oder Avro-Quelldateien komplexe Typen enthalten, können Sie die JSON-Ausgabe für diese allgemeinen komplexen Typen abfragen. Beispiel: Im Folgenden wird eine ORC-Datei, movie-info.orc, mit einem komplexen Typ dargestellt (dieselbe komplexe Typverarbeitung gilt für Parquet- und Avro-Quelldateien).

Betrachten wir die Datei movie-info.orc mit dem folgenden Schema:

id    int
original_title string
overview       string
poster_path    string
release_date   string
vote_count     int
runtime        int
popularity     double
genres         array<struct<id:int,name:string>

Beachten Sie, dass jeder Film mit dem Array genres nach mehreren genres kategorisiert wird. Das genres-Array ist ein array von structs, und jedes Element hat eine id (int) und einen name (string). Das Array genres wird als komplexer Typ betrachtet. Sie können wie folgt eine Tabelle für diese ORC-Datei mit DBMS_CLOUD.CREATE_EXTERNAL_TABLE erstellen:

BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
        table_name =>'movie_info',
        credential_name =>'OBJ_STORE_CRED',
        file_uri_list =>'https://objectstorage.us-phoenix-1.oraclecloud.com/n/mytenancy/b/movies/o/movie-info.orc',
        format => '{"type":"orc", "schema": "first"}');
END;
/

Wenn Sie die externe Tabelle erstellen, generiert die Datenbank automatisch die Spalten basierend auf dem Schema in der ORC-Datei (wenn Sie Avro oder Parkett verwenden, gilt dasselbe). In diesem Beispiel erstellt DBMS_CLOUD.CREATE_EXTERNAL_TABLE wie folgt eine Tabelle in Ihrer Datenbank:

CREATE TABLE "ADMIN"."MOVIE_INFO" 
    ( "ID"
      NUMBER(10,0), 
      "ORIGINAL_TITLE"  VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP", 
      "OVERVIEW"        VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP", 
      "POSTER_PATH"     VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP", 
      "RELEASE_DATE"    VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP", 
      "VOTE_COUNT"      NUMBER(10,0), 
      "RUNTIME"         NUMBER(10,0), 
      "POPULARITY"      BINARY_DOUBLE, 
      "GENRES"          VARCHAR2(4000 BYTE) COLLATE "USING_NLS_COMP"
    )  DEFAULT COLLATION "USING_NLS_COMP"
    ORGANIZATION EXTERNAL 
     ( TYPE      ORACLE_BIGDATA
       DEFAULT DIRECTORY "DATA_PUMP_DIR"
       ACCESS PARAMETERS
       ( com.oracle.bigdata.credential.name=OBJ_STORE_CRED
         com.oracle.bigdata.fileformat=ORC
   )
       LOCATION
        (
      'https://objectstorage.us-phoenix-1.oraclecloud.com/n/mytenancy/b/movies/o/movie-info.orc'
           )
     )
   REJECT LIMIT UNLIMITED 
   PARALLEL;
 )

Jetzt können Sie die Filmdaten abfragen:

SELECT original_title, release_date, genres 
     FROM movie_info 
     WHERE release_date > '2000'
     ORDER BY original_title;

Dadurch wird folgende Ausgabe erzeugt:


original_title              release_date   genres
(500) Days of Summer        2009           [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},{"id":17,"name":"Horror"},{"id":19,"name":"Western"},{"id":18,"name":"War"},{"id":15,"name":"Romance"}]
10,000 BC                   2008           [{"id":6,"name":"Comedy"}]
11:14                       2003           [{"id":9,"name":"Thriller"},{"id":14,"name":"Family"}]
127 Hours                   2010           [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"}]
13 Going on 30              2004           [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"},{"id":18,"name":"War"},{"id":15,"name":"Romance"}]
1408                        2007           [{"id":45,"name":"Sci-Fi"},{"id":6,"name":"Comedy"},{"id":17,"name":"Horror"},{"id":6,"name":"Comedy"},{"id":18,"name":"War"}]

Beachten Sie, dass der komplexe Typ genres als JSON-Array zurückgegeben wird.

Um die JSON-Daten noch besser nutzen zu können, können Sie die Spalte mit den Oracle-JSON-Funktionen transformieren. Beispiel: Sie können die JSON-Notation "." sowie die leistungsstärkeren Transformationsfunktionen wie JSON_TABLE verwenden.

Informationen zur "."-Notation finden Sie unter Zugriff auf JSON-Daten mit einfacher Punktbenachrichtigung.

Informationen zu JSON_TABLE finden Sie unter SQL/JSON-Funktion JSON_TABLE.

Das folgende Beispiel zeigt eine Abfrage in der Tabelle, die jeden Wert des Arrays in eine Zeile in der Ergebnismenge umwandelt:
SELECT original_title, release_date, m.genre_name, genres
    FROM movie_info mi,
       JSON_TABLE(mi.genres, '$.name[*]'
        COLUMNS (genre_name VARCHAR2(25) PATH
      '$')                 
                 ) AS m
 WHERE rownum < 10;

JSON_TABLE erstellt eine Zeile für jeden Wert des Arrays, wie bei einem Outer Join, und "struct" wird geparst, um den Namen des Genres zu extrahieren. Dadurch wird folgende Ausgabe erzeugt:


original_title                   release_date         genre_name        genres
(500) Days of Summer             2009                 Drama             [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},
                                                                        {"id":17,"name":"Horror"},{"id":19,"name":"Western"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
(500) Days of Summer             2009                 Comedy            [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},
                                                                        {"id":17,"name":"Horror"},{"id":19,"name":"Western"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
(500) Days of Summer             2009                 Horror            [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},
                                                                        {"id":17,"name":"Horror"},{"id":19,"name":"Western"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
(500) Days of Summer             2009                 Western           [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},
                                                                        {"id":17,"name":"Horror"},{"id":19,"name":"Western"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
(500) Days of Summer             2009                 War               [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},
                                                                        {"id":17,"name":"Horror"},{"id":19,"name":"Western"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
(500) Days of Summer             2009                 Romance           [{"id":3,"name":"Drama"},{"id":6,"name":"Comedy"},
                                                                        {"id":17,"name":"Horror"},{"id":19,"name":"Western"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
10,000 BC                        2008                 Comedy            [{"id":6,"name":"Comedy"}]
11:14                            2003                 Family            [{"id":9,"name":"Thriller"},{"id":14,"name":"Family"}]
11:14                            2003                 Thriller          [{"id":9,"name":"Thriller"},{"id":14,"name":"Family"}]
127 Hours                        2010                 Comedy            [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"}]
127 Hours                        2010                 Drama             [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"}]
13 Going on 30                   2004                 Romance           [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
13 Going on 30                   2004                 Comedy            [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
13 Going on 30                   2004                 War               [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]
13 Going on 30                   2004                 Drama             [{"id":6,"name":"Comedy"},{"id":3,"name":"Drama"},
                                                                        {"id":18,"name":"War"},{"id":15,"name":"Romance"}]