DBMS_CLOUD Avro、ORC 和 Parquet 支援

本節涵蓋自治式 AI 資料庫隨附的 DBMS_CLOUD Avro、ORC 和 Parquet 支援。

Avro、ORC 或 Parquet 的 DBMS_CLOUD 套裝程式格式選項

DBMS_CLOUD 中的格式引數指定來源檔案的格式。

指定格式引數的兩種方式如下:

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

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

範例:

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

若要指定多個格式選項,請以 "," 分隔值。

舉例而言:

format => json_object('ignoremissingcolumns' value 'true', 'removequotes' value 'true', 'dateformat' value 'YYYY-MM-DD-HH24-MI-SS', 'blankasnull' value 'true')
格式選項 描述 語法
regexuri

regexuri 值設為 TRUE 時,您可以在 Cloud 來源檔案 URI 的檔案名稱中使用萬用字元以及正規表示式。

regexuri 參數設為 FALSE 時,字元 "*" 和 "?" 會被視為萬用字元。當 regexuri 參數設為 TRUE 時,字元 "*" 與 "?" 為指定之正規表示式樣式的一部分。

只有您 URI 中的檔案名稱或子資料夾路徑才支援正規表示式樣式,而且樣式比對與 REGEXP_LIKE 函數所執行的樣式相同。目錄名稱不支援正規表示式樣式。

對於外部表格,只有在物件儲存中的檔案上建立的表格才支援此選項。

舉例而言:

format => JSON_OBJECT('regexuri' value TRUE)

請參閱 Oracle Database 19c SQL Language ReferenceOracle Database 26ai SQL Language Reference 中的 REGEXP_LIKE Criteria ,瞭解 REGEXP_LIKE 條件的詳細資訊。

regexuri: True

預設值:False

type 指定檔案類型。

type: avro | orc | parquet

schema

當綱要設為 firstall 時,外部表格資料欄和資料類型會自動衍生自 Avro、ORC 或 Parquet 檔案描述資料。

資料欄名稱將會與 Avro、ORC 或 Parquet 中找到的資料欄名稱相符。資料類型會從 Avro、ORC 或 Parquet 資料類型轉換成 Oracle 資料類型。所有欄皆已新增至表格。

first 值指定使用 file_uri_list 中第一個 Avro、ORC 或 Parquet 檔案的中繼資料自動產生資料欄及其資料類型。如果所有檔案都有相同的綱要,請使用 first

all 值指定使用 file_uri_list 中所有 Avro、ORC 或 Parquet 檔案的中繼資料自動產生資料欄及其資料類型。如果檔案可能有不同的綱要,請使用 all (較慢)。

預設值:如果指定 column_list,則會忽略 schema 值 (如果指定)。如果未指定 column_list,則 schema 預設值為 first

注意:對於 Avro、ORC 或 Parquet 格式檔案,無法使用 schema 格式選項,而且必須使用 DBMS_CLOUD.CREATE_EXTERNAL_PART_TABLE 程序,為分割的外部表格指定 column_list 參數。

schema : first | all

DBMS_CLOUD 套裝程式 Avro 與 Oracle 資料類型對應

描述 Avro 資料類型與 Oracle 資料類型的對應。

注意:從 Oracle Database 19c 開始,支援複雜類型 (例如對應、陣列和結構)。請參閱 DBMS_CLOUD Package Avro,ORC,and Parquet Complex Types 瞭解使用 Avro 複雜類型的相關資訊。

Avro 類型 Oracle 類型
INT NUMBER(10)
LONG 數字 (19)
小工具 數字 (1)
UTF8 位元組陣列 RAW(2000)
航班 BINARY_FLOAT
資料庫 BINARY_DOUBLE
DECIMAL (p) 數字 (p)
DECIMAL (p,s) 數字 (p,s)
DATE DATE
STRING VARCHAR2
時間 VARCHAR2 (20 位元組)
時間微量 VARCHAR2 (20 位元組)
時間戳記 TIMESTAMP(3)
時間戳記微分 TIMESTAMP(6)
列舉 VARCHAR2 (n) 其中:"n" 是 AVRO ENUM 可能值的實際最大長度
DURATION RAW(2000)
固定 RAW(2000)
NULL VARCHAR2 (1) 位元組

請參閱 DBMS_CLOUD Package Avro,ORC,and Parquet Complex Types 瞭解使用 Avro 複雜類型的相關資訊。

DBMS_CLOUD 套裝程式 ORC 與 Oracle 資料類型對應

描述 ORC 資料類型與 Oracle 資料類型的對應。

請參閱 DBMS_CLOUD Package Avro,ORC,and Parquet Complex Types 瞭解使用 ORC 複雜類型的相關資訊。

ORC 類型 Oracle 類型 其他資訊
陣列 VARCHAR2 (n) JSON 格式 DBMS_CLOUD 套裝程式 Avro、ORC 以及 Parquet 複雜類型
bigint (64 位元) 數字 (19)  
二進位 BLOB  
布林值 (1 位元) 數字 (1)  
字元 字元  
日期 DATE  
雙精準數 BINARY_DOUBLE  
浮點數 BINARY_FLOAT  
int (32 位元) NUMBER(10)  
清單 VARCHAR2 (n) JSON 格式 DBMS_CLOUD 套裝程式 Avro、ORC 以及 Parquet 複雜類型
對應 VARCHAR2 (n) JSON 格式 DBMS_CLOUD 套裝程式 Avro、ORC 以及 Parquet 複雜類型
smallint (16 位元) 數字 (5)  
字串 VARCHAR2(4000)  
struct VARCHAR2 (n) JSON 格式 DBMS_CLOUD 套裝程式 Avro、ORC 以及 Parquet 複雜類型
時戳 TIMESTAMP  
tinyint (8 位元) 數字 (3)  
工會 VARCHAR2 (n) JSON 格式 DBMS_CLOUD 套裝程式 Avro、ORC 以及 Parquet 複雜類型
varchar VARCHAR2 (n)  

DBMS_CLOUD 套裝程式剖析與 Oracle 資料類型對應

描述 Parquet 資料類型與 Oracle 資料類型的對應。

注意:從 Oracle Database 19c 開始,支援複雜類型 (例如對應、陣列和結構)。請參閱 DBMS_CLOUD Package Avro,ORC,and Parquet Complex Types 瞭解使用 Parquet Complex 類型的資訊。

宴會類型 Oracle 類型
UINT_64 數字 (20)
INT_64 數字 (19)
UINT_32 NUMBER(10)
INT_32 NUMBER(10)
UINT_16 數字 (5)
INT_16 數字 (5)
UINT_8 數字 (3)
INT_8 數字 (3)
小工具 數字 (1)
UTF8 位元組陣列 VARCHAR2 (4000 位元組)
航班 BINARY_FLOAT
資料庫 BINARY_DOUBLE
DECIMAL (p) 數字 (p)
DECIMAL (p,s) 數字 (p,s)
DATE DATE
STRING VARCHAR2(4000)
時間 VARCHAR2 (20 位元組)
繁體中文 (台灣) VARCHAR2 (20 位元組)
時間微量 VARCHAR2 (20 位元組)
時間 _ 微量 _UTC VARCHAR2 (20 位元組)
時間戳記 TIMESTAMP(3)
時間戳記 _ 毫秒 TIMESTAMP(3)
時間戳記微分 TIMESTAMP(6)
TIMESTAMP_MICROS_UTC TIMESTAMP(6)
時間戳記 - 納諾斯 TIMESTAMP(9)

請參閱 DBMS_CLOUD Package Avro,ORC,and Parquet Complex Types 瞭解使用 Parquet Complex 類型的資訊。

DBMS_CLOUD 套裝程式 Oracle 資料類型與宴會對應

描述 Oracle 資料類型與 Parquet 資料類型的對應。

Oracle 類型 宴會類型
BINARY_DOUBLE 資料庫
BINARY_FLOAT 航班
DATE DATE
數字 (p,s) DECIMAL (p,s)
數字 (p) DECIMAL (p)
TIMESTAMP(3) 時間戳記
TIMESTAMP(3) 時間戳記 _ 毫秒
TIMESTAMP(6) 時間戳記微分
TIMESTAMP(6) TIMESTAMP_MICROS_UTC
TIMESTAMP(9) 時間戳記 - 納諾斯
VARCHAR2(4000) STRING

NLS 階段作業參數

NLS 階段作業參數 NLS_DATE_FORMATNLS_TIMESTAMP_FORMATNLS_TIMESTAMP_TZ_FORMATNLS_NUMERIC_CHARACTERS 定義查詢具有這些資料欄類型的表格時,應如何顯示日期、時戳、時區格式的時戳,以及含小數標記之時戳的基數區隔符號。

此外,當您使用 DBMS_CLOUD.EXPORT_DATA 匯出資料並指定 Parquet 輸出時,Autonomous AI Database 會從 NLS_SESSION_PARAMETERS 表格讀取這些參數的值。自治式 AI 資料庫使用這些值將 Oracle 資料類型 DATETIMESTAMP 轉換為 Parquet 類型。

NLS_SESSION_PARAMETERS 參數支援 RR 格式遮罩 (兩個字元年份規格)。

當您使用 DBMS_CLOUD.EXPORT_DATA 將資料匯出至 Parquet 時,這些參數不支援年份的 RR 格式遮罩。如果您嘗試匯出至 parquet,而 NLS_SESSION_PARAMETERS 設為使用 RR 格式遮罩,就會發生應用程式錯誤 (RR 格式的預設值取決於 NLS_TERRITORY 參數的值)。

當其中一個參數 NLS_DATE_FORMATNLS_TIMESTAMP_FORMATNLS_TIMESTAMP_TZ_FORMAT 使用 RR 格式遮罩時,您必須將格式值變更為支援的值,才能將資料匯出至含有 DBMS_CLOUD.EXPORT_DATA 的 Parquet。舉例而言:

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

變更值之後,您可以查詢 NLS_SESSION_PARAMETERS 視觀表來驗證變更:

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

如果設定 NLS_DATE_FORMAT,則會套用至資料類型為 DATE 的資料欄。如果設定 NLS_TIMESTAMP_FORMAT,則會套用至資料類型為 TIMESTAMP 的資料欄。如果設定 NLS_TIMESTAMP_TZ_FORMAT,則會套用至資料類型為 TIMESTAMP WITH TIME ZONE 的資料欄。

請參閱 Oracle Database 19c Database Globalization Support GuideOracle Database 26ai Database Globalization Support Guide 中的 Date and Time Parameters ,以及 Oracle Database 19c Database Globalization Support GuideOracle Database 26ai Database Globalization Support Guide 中的 NLS Data Dictionary Views 以瞭解詳細資訊。

DBMS_CLOUD 套裝程式 Avro、ORC 以及 Parquet 複雜類型

描述 Avro、ORC 和 Parquet 複雜資料類型與 Oracle 資料類型的對應。

自主 AI 資料庫支援複雜的資料類型,包括以下複雜類型:

當您指定 Avro、ORC 或 Parquet 的來源檔案類型,且來源檔案包含複雜資料欄時,自治式 AI 資料庫查詢會傳回複雜資料欄的 JSON。這可簡化查詢結果的處理;您可以跨檔案類型和資料類型一致地使用 Oracle 的強大 JSON 剖析功能。下表顯示「自治式 AI 資料庫」中複雜類型的格式:

注意:複雜欄位會對應至 VARCHAR2 資料欄,並套用 VARCHAR2 大小限制。

Type Parquet ORC Avro Oracle
清單:值順序 列出 列出 陣列 VARCHAR2 (JSON 格式)
地圖:具有單一索引鍵的物件清單 對應 對應 對應 VARCHAR2 (JSON 格式)
聯集:不同型態的值 無法使用 聯集 聯集 VARCHAR2 (JSON 格式)
物件:零或多個索引鍵 - 值組 結構 結構 記錄 VARCHAR2 (JSON 格式)

如果您的 ORC、Parquet 或 Avro 來源檔案包含複雜類型,您可以查詢這些通用複雜類型的 JSON 輸出。例如,下列顯示具有複雜類型的 ORC 檔案 movie-info.orc (適用於 Parquet 和 Avro 來源檔案的相同複雜類型處理)。

請考慮使用下列綱要的 movie-info.orc 檔案:

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>

請注意,每個影片使用 genres 陣列依多個 genres 分類。genres 陣列是 structsarray,每個項目都有 id (int) 和 name (string)。genres 陣列被視為複雜類型。您可以使用 DBMS_CLOUD.CREATE_EXTERNAL_TABLE 透過此 ORC 檔案建立表格,如下所示:

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

當您建立外部表格時,資料庫會根據 ORC 檔案中的結構自動產生欄 (如果您使用 Avro 或 Parquet,同樣適用)。在此範例中,DBMS_CLOUD.CREATE_EXTERNAL_TABLE 會在您的資料庫中建立表格,如下所示:

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

現在,您可以查詢影片資料:

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

這會產生下列輸出:

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

請注意,複雜類型 genres 會傳回為 JSON 陣列。

若要讓 JSON 資料更加實用,您可以使用 Oracle 的 JSON 函數轉換資料欄。例如,您可以使用 JSON "." 表示法以及更強大的轉換函數 (例如 JSON_TABLE)。

請參閱 Oracle Database 19c JSON Developer's GuideOracle Database 26ai JSON Developer's Guide 中的 Simple Dot-Notation Access to JSON Data ,瞭解有關 "." 表示法的資訊。

請參閱 Oracle Database 19c JSON Developer's Guide 中的 SQL/JSON Function JSON_TABLEOracle Database 26ai JSON Developer's Guide ,瞭解有關 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 會為陣列的每個值建立一個資料列,思考外部結合,並剖析結構以擷取基因的名稱。這會產生下列輸出:

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

DBMS_CLOUD 套裝程式 Avro、ORC 以及 Parquet 與 Oracle 資料欄名稱對應

描述 Avro、ORC 以及 Parquet 資料欄名稱如何轉換為 Oracle 資料欄名稱的規則。

Avro、ORC 和 Parquet 資料欄名稱支援下列項目,但可能需要在外部表格中的 Oracle SQL 參照使用雙引號。因此,為了方便使用,並避免在參考資料欄名稱時使用雙引號,如果可能的話,請不要在 Avro、ORC 和 Parquet 資料欄名稱中使用下列項目:

下表顯示各種類型的 Avro、ORC 和 Parquet 資料欄名稱,以及在外部表格的 Oracle 資料欄名稱中使用資料欄名稱的規則。

Avro、ORC 或 Parquet 名稱 CREATE TABLE 名稱 Oracle 目錄 有效 SQL 備註
PART (部分) 或 PART PART,PART,零件,PART 部分

select part

select Part

select paRt

select PART

Oracle 的隱含大寫無引號的資料欄名稱。
訂單編號 「訂單編號」 訂單編號 select "Ord No" 當有內嵌空白時,需要雙引號,這也會保留字元大小寫。
__index_key__ "__index_key__" __index_key__ select "__index_key__" 當前面的底線同時保留字元大小寫時,需要雙引號。
6Way "6Way" 6Way select "6Way" 有前置數字時,必須使用雙引號,這也會保留字元大小寫。
CREATE、CREATE 或 CREATE 等等。(任何情況變動) 分割區、分割區、PARTITION 等等 (針對 Oracle 保留字) 「建立」「分割區」 建立分割

select "CREATE"

select "PARTITION"

Oracle SQL 保留字需有雙引號。這些是強制使用大寫的,但在 SQL 中的任何位置使用時,必須一律使用雙引號。
ROWID、ROWID、ROWID 等等 (若為 ROWID,請參閱備註) 列 ID  

select "rowid"

select "Rowid"

select "ROWid"

select "rowid"

若為 ROWID,任何混合或小寫的 ROWID 變化都會保留大小寫,且必須一律使用雙引號括住,並使用原始大小寫的變化。由於表格的 Oracle ROWID 固有衝突,如果您指定大寫 ROWID,系統會自動將它儲存為小寫 "ROWID",並在參照時一律加上雙引號。

注意事項