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 :

Note

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.

L'exemple suivant montre une interrogation sur la table qui prend chaque valeur du tableau et transforme la valeur en ligne dans l'ensemble de résultats :
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"}]