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:
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.
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"}]
Übergeordnetes Thema: DBMS_CLOUD Unterstützung für Avro, ORC und Parquet