DBMS_CLOUD-Package - Komplexe Avro-, ORC- und Parquet-Typen

Beschreibt die Zuordnung komplexer Avro-, ORC- und Parquet-Datentypen zu Oracle-Datentypen.

Autonomous Database unterstützt komplexe Datentypen, einschließlich der folgenden komplexen Typen:

  • struct

  • Liste

  • Karte

  • Gewerkschaft

  • Array

Wenn Sie den Quelldateityp Avro, ORC oder Parquet 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-Parsingfeatures von Oracle konsistent über die Dateitypen und Datentypen hinweg verwenden. Die folgende Tabelle zeigt das Format für die komplexen Typen in Autonomous Database:

Hinweis

Die komplexen Felder werden den Spalten VARCHAR2 zugeordnet, und es gelten die Größenbeschränkungen von VARCHAR2.
Typ Parquet ORC Avro Oracle
Liste: Folge von Werten Liste Liste Array VARCHAR2 (JSON-Format)
Karte: Liste der Objekte mit einem Schlüssel Karte Karte Karte VARCHAR2 (JSON-Format)
Union: Werte unterschiedlicher Art Nicht verfügbar Gewerkschaft Gewerkschaft VARCHAR2 (JSON-Format)
Objekt: Null oder mehr Schlüssel/Wert-Paare 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 Sie 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 einem Array von genres nach mehreren genres kategorisiert wird. Das genres-Array ist ein array von structs, und jedes Element hat ein id (int) und ein name (string). Das Array genres wird als komplexer Typ betrachtet. Sie können eine Tabelle über diese ORC-Datei mit DBMS_CLOUD.CREATE_EXTERNAL_TABLE wie folgt 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 die Spalten automatisch basierend auf dem Schema in der ORC-Datei. (Wenn Sie Avro oder Parquet verwenden, gilt das gleiche.) In diesem Beispiel erstellt die DBMS_CLOUD.CREATE_EXTERNAL_TABLE eine Tabelle in der Datenbank wie folgt:

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 die 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 nützlicher zu machen, können Sie die Spalte mit den JSON-Funktionen von Oracle transformieren. Beispiel: Sie können die JSON-Notation "." sowie die leistungsstärkeren Transformationsfunktionen wie JSON_TABLE verwenden.

Informationen zur Notation "." finden Sie unter Einfacher Dot-Notation-Zugriff auf JSON-Daten.

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

Das folgende Beispiel zeigt eine Abfrage der Tabelle, die jeden Wert des Arrays annimmt und den Wert 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, Think Outer Join und die Struktur 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"}]