Soporte de Avro, ORC y Parquet en DBMS_CLOUD

En esta sección se aborda el soporte de Avro, ORC y Parquet DBMS_CLOUD proporcionado con Autonomous AI Database.

Opciones de formato del paquete DBMS_CLOUD para Avro, ORC o Parquet

El argumento format en DBMS_CLOUD especifica el formato de los archivos de origen.

Las dos formas de especificar el argumento de formato son las siguientes:

format => '{"format_option" : "format_value" }'

y

format => json_object('format_option' value 'format_value')

Ejemplos:

format => json_object('type' VALUE 'CSV')

Para especificar varias opciones del formato, separe los valores con una ",".

Por ejemplo:

format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
Opción de formato Descripción Sintaxis
regexuri

Cuando el valor de regexuri se define en TRUE, puede utilizar comodines y expresiones regulares en los nombres de archivo en los URI de archivo de origen de nube.

Los caracteres "*" y "?" se consideran caracteres comodín cuando el parámetro regexuri se define en FALSE. Cuando el parámetro regexuri se define en TRUE, los caracteres "*" y "?" forman parte del patrón de expresión regular especificado.

Los patrones de expresión regular solo están soportados para el nombre de archivo o la ruta de subcarpeta en los URI y la coincidencia de patrones es idéntica a la realizada por la función REGEXP_LIKE. Los patrones de expresión regular no están soportados para los nombres de directorio.

En el caso de las tablas externas, esta opción solo está soportada con las tablas que se crean en un archivo de Object Storage.

Por ejemplo:

format => JSON_OBJECT('regexuri' value TRUE)

Consulte Condición REGEXP_LIKE en Referencia de lenguaje SQL de Oracle Database 19c o Referencia de lenguaje SQL de Oracle Database 26ai para obtener más información sobre la condición REGEXP_LIKE.

regexuri: True

Valor por defecto:False

type Especifica el tipo del archivo.

type: avro | orc | parquet

schema

Cuando el esquema se define en first o all, las columnas de tabla externa y los tipos de dato se derivan automáticamente de los metadatos del archivo Avro, ORC o Parquet.

Los nombres de columna coincidirán con los que se encuentran en Avro, ORC o Parquet. Los tipos de dato se convierten de tipos de dato Avro, ORC o Parquet a tipos de dato de Oracle. Todas las columnas se agregan a la tabla.

El valor first especifica que se utilicen los metadatos del primer archivo Avro, ORC o Parquet de file_uri_list para generar automáticamente las columnas y sus tipos de dato. Utilice first si todos los archivos tienen el mismo esquema.

El valor all especifica que se utilicen los metadatos de todos los archivos Avro, ORC o Parquet de file_uri_list para generar automáticamente las columnas y sus tipos de dato. Utilice all (más lento) si los archivos pueden tener diferentes esquemas.

Por defecto: si se especifica column_list, se ignora el valor schema, si se especifica. Si no se especifica column_list, el valor por defecto schema es first.

Nota: Para los archivos de formato Avro, ORC o Parquet, la opción de formato schema no está disponible y se debe especificar el parámetro column_list para las tablas externas particionadas mediante el procedimiento DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE.

schema : first | all

Asignación de tipo de datos de Avro a Oracle en el paquete DBMS_CLOUD

Describe la asignación de tipos de dato Avro a tipos de dato de Oracle.

Nota: Los tipos complejos, como mapas, matrices y estructuras, están soportados a partir de Oracle Database 19c. Consulte DBMS_CLOUD Package Avro, ORC, and Parquet Complex Types para obtener información sobre el uso de tipos de complejos Avro.

Tipo de Avro Type Oracle
INT NUMBER(10)
LONG NÚMERO(19)
Booleano NÚMERO(1)
MATRIZ DE BYTES UTF8 RAW(2000)
FLT BINARY_FLOAT
DBL BINARY_DOUBLE
DECIMAL(p) NÚMERO(p)
DECIMAL(p,s) NUMBER(p,s)
DATE DATE
STRING VARCHAR2
TIME_MILLIS VARCHAR2(20 BYTES)
TIME_MICROS VARCHAR2(20 BYTES)
TIMESTAMP_MILLIS TIMESTAMP(3)
TIMESTAMP_MICROS TIMESTAMP(6)
ENUM VARCHAR2(n) Donde: "n" es la longitud máxima real de los posibles valores de AVRO ENUM
DURATION RAW(2000)
FIXED RAW(2000)
NULL VARCHAR2(1) BYTE

Consulte DBMS_CLOUD Package Avro, ORC, and Parquet Complex Types para obtener información sobre el uso de tipos de complejos Avro.

Asignación de tipo de datos de ORC a Oracle en el paquete DBMS_CLOUD

Describe la asignación de tipos de dato ORC a tipos de dato Oracle.

Consulte DBMS_CLOUD Package Avro, ORC, and Parquet Complex Types para obtener información sobre el uso de tipos de complejos ORC.

Tipo de ORC Type Oracle Más información
matriz Formato JSON VARCHAR2(n) Tipos complejos de Avro, ORC y Parquet del paquete DBMS_CLOUD
bigint (64 bits) NÚMERO(19)  
binario BLOB  
booleano (1 bit) NÚMERO(1)  
carácter CHAR(n)  
Fecha DATE  
doble BINARY_DOUBLE  
float BINARY_FLOAT  
int (32 bits) NUMBER(10)  
list Formato JSON VARCHAR2(n) Tipos complejos de Avro, ORC y Parquet del paquete DBMS_CLOUD
mapa Formato JSON VARCHAR2(n) Tipos complejos de Avro, ORC y Parquet del paquete DBMS_CLOUD
Smallint (16 bits) NÚMERO(5)  
Cadena VARCHAR2(4000)  
struct Formato JSON VARCHAR2(n) Tipos complejos de Avro, ORC y Parquet del paquete DBMS_CLOUD
registro de hora TIMESTAMP  
diminuto (8 bits) NÚMERO(3)  
union Formato JSON VARCHAR2(n) Tipos complejos de Avro, ORC y Parquet del paquete DBMS_CLOUD
varchar VARCHAR2(n)  

Asignación de tipo de datos de Parquet a Oracle en el paquete DBMS_CLOUD

Describe la asignación de tipos de dato Parquet a tipos de dato de Oracle.

Nota: Los tipos complejos, como mapas, matrices y estructuras, están soportados a partir de Oracle Database 19c. Consulte DBMS_CLOUD Package Avro, ORC, and Parquet Complex Types para obtener información sobre el uso de tipos complejos de Parquet.

Tipo de parquet Type Oracle
UINT_64 NÚMERO(20)
INT_64 NÚMERO(19)
UINT_32 NUMBER(10)
INT_32 NUMBER(10)
UINT_16 NÚMERO(5)
INT_16 NÚMERO(5)
UINT_8 NÚMERO(3)
INT_8 NÚMERO(3)
Booleano NÚMERO(1)
MATRIZ DE BYTES UTF8 VARCHAR2(4000 BYTE)
FLT BINARY_FLOAT
DBL BINARY_DOUBLE
DECIMAL(p) NÚMERO(p)
DECIMAL(p,s) NUMBER(p,s)
DATE DATE
STRING VARCHAR2(4000)
TIME_MILLIS VARCHAR2(20 BYTES)
HORA_MILLIS_UTC VARCHAR2(20 BYTES)
TIME_MICROS VARCHAR2(20 BYTES)
HORA_MICROS_UTC VARCHAR2(20 BYTES)
TIMESTAMP_MILLIS TIMESTAMP(3)
REGISTRO DE HORA_MILLIS_UTC TIMESTAMP(3)
TIMESTAMP_MICROS TIMESTAMP(6)
REGISTRO DE HORA_MICROS_UTC TIMESTAMP(6)
NANOS_REGISTRO DE HORA TIMESTAMP(9)

Consulte DBMS_CLOUD Package Avro, ORC, and Parquet Complex Types para obtener información sobre el uso de tipos complejos de Parquet.

Asignación de tipo de dato de Oracle a Parquet de paquete DBMS_CLOUD

Describe la asignación de tipos de dato de Oracle a tipos de dato Parquet.

Type Oracle Tipo de parquet
BINARY_DOUBLE DBL
BINARY_FLOAT FLT
DATE DATE
NUMBER(p,s) DECIMAL(p,s)
NÚMERO(p) DECIMAL(p)
TIMESTAMP(3) TIMESTAMP_MILLIS
TIMESTAMP(3) REGISTRO DE HORA_MILLIS_UTC
TIMESTAMP(6) TIMESTAMP_MICROS
TIMESTAMP(6) REGISTRO DE HORA_MICROS_UTC
TIMESTAMP(9) NANOS_REGISTRO DE HORA
VARCHAR2(4000) STRING

Parámetros de Sesión NLS

Los parámetros de sesión de NLS NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT, NLS_TIMESTAMP_TZ_FORMAT y NLS_NUMERIC_CHARACTERS definen cómo se deben mostrar la fecha, el registro de hora, el registro de hora con formato de zona horaria y el separador de radix para el registro de hora con marcador decimal cuando se consulta una tabla con esos tipos de columna.

Además, al exportar datos mediante DBMS_CLOUD.EXPORT_DATA y especificar la salida de Parquet, la base de datos de IA autónoma lee los valores de estos parámetros de la tabla NLS_SESSION_PARAMETERS. La base de datos de IA autónoma utiliza estos valores para convertir los tipos de dato de Oracle DATE o TIMESTAMP en tipos de Parquet.

Los parámetros NLS_SESSION_PARAMETERS soportan una máscara de formato RR (especificación de año de dos caracteres).

La máscara de formato RR para el año no está soportada para estos parámetros al exportar datos a Parquet con DBMS_CLOUD.EXPORT_DATA. Se emite un error de aplicación si intenta exportar a parquet y NLS_SESSION_PARAMETERS se define para utilizar la máscara de formato RR (el valor por defecto para el formato RR depende del valor del parámetro NLS_TERRITORY).

Cuando uno de los parámetros NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT o NLS_TIMESTAMP_TZ_FORMAT utiliza la máscara de formato RR, debe cambiar el valor de formato al valor soportado para exportar datos a Parquet con DBMS_CLOUD.EXPORT_DATA. Por ejemplo:

ALTER SESSION SET NLS_DATE_FORMAT = "MM/DD/YYYY";
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH:MI:SS.FF';
ALTER SESSION SET  NLS_TIMESTAMP_TZ_FORMAT='YYYY-MM-DD HH:MI:SS.FF TZH:TZM';

Después de cambiar el valor, puede verificar el cambio consultando la vista NLS_SESSION_PARAMETERS:

SELECT value FROM NLS_SESSION_PARAMETERS
       WHERE parameter IN ('NLS_DATE_FORMAT','NLS_TIMESTAMP_FORMAT','NLS_TIMESTAMP_TZ_FORMAT');

Si se define NLS_DATE_FORMAT, se aplica a las columnas con el tipo de dato DATE. Si se define NLS_TIMESTAMP_FORMAT, se aplica a las columnas con el tipo de dato TIMESTAMP. Si se define NLS_TIMESTAMP_TZ_FORMAT, se aplica a las columnas con el tipo de dato TIMESTAMP WITH TIME ZONE.

Consulte Parámetros de Fecha y Hora en Oracle Database 19c Database Globalization Support Guide o Oracle Database 26ai Database Globalization Support Guide y NLS Data Dictionary Views en Oracle Database 19c Database Globalization Support Guide o Oracle Database 26ai Database Globalization Support Guide para obtener más información.

Tipos complejos de Avro, ORC y Parquet del paquete DBMS_CLOUD

Describe la asignación de tipos de dato complejos de Avro, ORC y Parquet a tipos de dato de Oracle.

La base de datos de IA autónoma admite tipos de datos complejos, incluidos los siguientes tipos complejos:

Cuando especifica un tipo de archivo de origen de Avro, ORC o Parquet y el archivo de origen incluye columnas complejas, las consultas de Autonomous AI Database devuelven JSON para las columnas complejas. Esto simplifica el procesamiento de los resultados de las consultas; puede utilizar las potentes funciones de análisis de JSON de Oracle de forma coherente en los tipos de archivo y los tipos de dato. En la siguiente tabla se muestra el formato de los tipos complejos en la base de datos de IA autónoma:

Nota: Los campos complejos se asignan a las columnas VARCHAR2 y se aplican los límites de tamaño VARCHAR2.

Tipo Parquet ORC Avro Oracle
Lista: secuencia de valores List List Matriz VARCHAR2 (formato JSON)
Mapa: lista de objetos con una sola clave Asignación Asignación Asignación VARCHAR2 (formato JSON)
Unión: valores de diferentes tipos No Disponible Unión Unión VARCHAR2 (formato JSON)
Objeto: cero o más pares clave-valor Estruc Estruc Registro VARCHAR2 (formato JSON)

Si los archivos de origen ORC, Parquet o Avro contienen tipos complejos, puede consultar la salida de JSON para estos tipos complejos comunes. Por ejemplo, a continuación se muestra un archivo ORC, movie-info.orc, con un tipo complejo (se aplica el mismo manejo de tipo complejo para los archivos de origen Parquet y Avro).

Considere el archivo movie-info.orc con el siguiente esquema:

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>

Observe que cada película se clasifica por varios genres mediante una matriz de genres. La matriz genres es un array de structs y cada elemento tiene un id (int) y un name (string). La matriz genres se considera un tipo complejo. Puede crear una tabla a través de este archivo ORC mediante DBMS_CLOUD.CREATE_EXTERNAL_TABLE de la siguiente forma:

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;
/

Al crear la tabla externa, la base de datos genera automáticamente las columnas basadas en el esquema del archivo ORC (si utiliza Avro o Parquet, se aplica lo mismo). Para este ejemplo, DBMS_CLOUD.CREATE_EXTERNAL_TABLE crea una tabla en la base de datos de la siguiente forma:

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;
 )

Ahora puede consultar los datos de la película:

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

De este modo, se produce la siguiente salida:

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"}]

Observe que el tipo complejo genres se devuelve como una matriz de JSON.

Para que los datos JSON sean más útiles, puede transformar la columna mediante las funciones JSON de Oracle. Por ejemplo, puede utilizar la notación JSON ".", así como las funciones de transformación más potentes, como JSON_TABLE.

Consulte Simple Dot-Notation Access to JSON Data en Oracle Database 19c JSON Developer's Guide u Oracle Database 26ai JSON Developer's Guide para obtener información sobre la notación ".".

Consulte SQL/JSON Function JSON_TABLE en la Oracle Database 19c JSON Developer's Guide u Oracle Database 26ai JSON Developer's Guide para obtener información sobre JSON_TABLE.

El siguiente ejemplo muestra una consulta en la tabla que toma cada valor de la matriz y convierte el valor en una fila en el juego de resultados:

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 crea una fila para cada valor de la matriz, piensa en la unión externa y la estructura se analiza para extraer el nombre del género. De esta forma, se produce la siguiente salida:

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"}]

Asignación de nombres de Avro, ORC y Parquet a la columna de Oracle en el paquete DBMS_CLOUD

Describe las reglas de conversión de los nombres de columna Avro, ORC y Parquet a nombres de columna de Oracle.

Los siguientes elementos están soportados para los nombres de columna Avro, ORC y Parquet, pero pueden requerir el uso de comillas dobles para las referencias de Oracle SQL en tablas externas. Por lo tanto, para facilitar el uso y evitar tener que utilizar comillas dobles al hacer referencia a los nombres de columna, si es posible, no utilice lo siguiente en los nombres de columna Avro, ORC y Parquet:

En la siguiente tabla se muestran varios tipos de nombres de columna de Avro, ORC y Parquet, así como reglas para utilizar los nombres de columna en los nombres de columna de Oracle en tablas externas.

Nombre de Avro, ORC o Parquet Nombre de CREATE TABLE CATÁLOGO DE Oracle SQL válido Notas:
pieza, pieza, o pieza parte, parte, parte PARTE

select part

select Part

select paRt

select PART

Oracle utiliza de forma implícita nombres de columna sin comillas.
Nº de orden "Nº de orden" Nº de orden select "Ord No" Las comillas dobles son necesarias cuando hay espacios en blanco incrustados, lo que también conserva las mayúsculas y minúsculas del carácter.
__index_key__ "__index_key__" __index_key__ select "__index_key__" Las comillas dobles son necesarias cuando hay un guion bajo inicial, que también conserva las mayúsculas y minúsculas del carácter.
6Vías "En 6 sentidos" 6Vías select "6Way" Las comillas dobles son necesarias cuando hay un dígito numérico inicial, que también conserva las mayúsculas y minúsculas del carácter.
crear, crear o crear, etc. (cualquier variación de caso), partición, partición, función, etc. (para una palabra reservada de Oracle) "CREAR" "PARTICIÓN" CREAR PARTICIÓN

select "CREATE"

select "PARTITION"

Se necesitan comillas dobles para las palabras reservadas de Oracle SQL. Estos están forzados a mayúsculas, pero siempre deben estar entre comillas dobles cuando se utilizan en cualquier lugar de SQL.
ROWID, ROWID, ROWID, etc. (para ROWID, consulte las notas) ID de fila  

select "rowid"

select "Rowid"

select "ROWid"

select "rowid"

Para ROWID, cualquier variación mixta o minúscula de ROWID conserva la caja y siempre debe estar entre comillas dobles y usar las variaciones originales de la caja. Debido al conflicto inherente con Oracle ROWID para la tabla, si especifica ROWID en mayúscula, se almacena automáticamente como "ROWID" en minúscula y siempre debe estar entre comillas dobles cuando se hace referencia a ella.

Notas