Types complexes Avro, ORC et Parquet dans l'ensemble DBMS_CLOUD
Décrit le mappage des types de données complexes Avro, ORC et Parquet aux types de données Oracle.
Autonomous AI Database prend en charge les types de données complexes suivants :
-
structure
-
liste
-
map
-
syndicat
-
tableau
Lorsque vous spécifiez un type de fichier source Avro, ORC ou Parquet et que le fichier source inclut des colonnes complexes, les interrogations de base de données d'intelligence artificielle autonome retournent des données JSON pour les colonnes complexes. Cela simplifie le traitement des résultats d'interrogation. Vous pouvez utiliser les puissantes fonctions d'analyse JSON d'Oracle de manière uniforme pour tous les types de fichier et tous les types de données. Le tableau suivant présente le format des types complexes dans Autonomous AI Database :
Les champs complexes sont mappés aux colonnes
VARCHAR2 et les limites de taille VARCHAR2 s'appliquent.
| Type | Parquet | Code de taux d'intérêt | Avro | Oracle |
|---|---|---|---|---|
| Liste : séquence de valeurs | List | List | Tableau | VARCHAR2 (format JSON)
|
| Carte : liste d'objets avec une seule clé | Carte | Carte | Carte | VARCHAR2 (format JSON)
|
| Union : valeurs de type différent | Non disponible | Union | Union | VARCHAR2 (format JSON)
|
| Objet : zéro paire clé-valeur ou plus | Struct | Struct | Enregistrement | VARCHAR2 (format JSON)
|
Si vos fichiers sources ORC, Parquet ou Avro contiennent des types complexes, vous pouvez interroger la sortie JSON pour ces types complexes courants. Par exemple, l'illustration suivante présente un fichier ORC, movie-info.orc, avec un type complexe (le même traitement de type complexe s'applique aux fichiers sources Parquet et Avro).
Considérez le fichier movie-info.orc avec le schéma suivant :
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>
Notez que chaque film est catégorisé par plusieurs genres à l'aide d'un tableau de genres. Le tableau genres est un array de structs et chaque élément comporte un id (int) et un name (string). Le tableau genres est considéré comme un type complexe. Vous pouvez créer une table sur ce fichier ORC à l'aide de DBMS_CLOUD.CREATE_EXTERNAL_TABLE comme suit :
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;
/
Lorsque vous créez la table externe, la base de données génère automatiquement les colonnes en fonction du schéma du fichier ORC (si vous utilisez Avro ou Parquet, il en va de même). Pour cet exemple, DBMS_CLOUD.CREATE_EXTERNAL_TABLE crée une table dans votre base de données comme suit :
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;
)
Vous pouvez maintenant interroger les données du film :
SELECT original_title, release_date, genres
FROM movie_info
WHERE release_date > '2000'
ORDER BY original_title;
Voici la sortie générée :
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"}]
Notez que le type complexe genres est retourné en tant que tableau JSON.
Pour rendre les données JSON plus utiles, vous pouvez transformer la colonne à l'aide des fonctions JSON d'Oracle. Par exemple, vous pouvez utiliser la notation JSON "." ainsi que les fonctions de transformation plus puissantes telles que JSON_TABLE.
Voir Accès simple à la notation par points aux données JSON pour plus d'informations sur la notation ".".
Voir Fonction SQL/JSON JSON_TABLE pour plus d'informations sur 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 crée une rangée pour chaque valeur du tableau, pense une jointure externe et la structure est analysée pour extraire le nom du genre. Voici la sortie générée :
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"}]
Rubrique parent : DBMS_CLOUD Prise en charge d'Avro, ORC et Parquet