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 |
當 當 只有您 URI 中的檔案名稱或子資料夾路徑才支援正規表示式樣式,而且樣式比對與 對於外部表格,只有在物件儲存中的檔案上建立的表格才支援此選項。 舉例而言:
請參閱 Oracle Database 19c SQL Language Reference 或 Oracle Database 26ai SQL Language Reference 中的 REGEXP_LIKE Criteria ,瞭解 |
預設值: |
type |
指定檔案類型。 |
|
schema |
當綱要設為 資料欄名稱將會與 Avro、ORC 或 Parquet 中找到的資料欄名稱相符。資料類型會從 Avro、ORC 或 Parquet 資料類型轉換成 Oracle 資料類型。所有欄皆已新增至表格。
預設值:如果指定 注意:對於 Avro、ORC 或 Parquet 格式檔案,無法使用 |
|
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_FORMAT、NLS_TIMESTAMP_FORMAT、NLS_TIMESTAMP_TZ_FORMAT 和 NLS_NUMERIC_CHARACTERS 定義查詢具有這些資料欄類型的表格時,應如何顯示日期、時戳、時區格式的時戳,以及含小數標記之時戳的基數區隔符號。
此外,當您使用 DBMS_CLOUD.EXPORT_DATA 匯出資料並指定 Parquet 輸出時,Autonomous AI Database 會從 NLS_SESSION_PARAMETERS 表格讀取這些參數的值。自治式 AI 資料庫使用這些值將 Oracle 資料類型 DATE 或 TIMESTAMP 轉換為 Parquet 類型。
NLS_SESSION_PARAMETERS 參數支援 RR 格式遮罩 (兩個字元年份規格)。
當您使用 DBMS_CLOUD.EXPORT_DATA 將資料匯出至 Parquet 時,這些參數不支援年份的 RR 格式遮罩。如果您嘗試匯出至 parquet,而 NLS_SESSION_PARAMETERS 設為使用 RR 格式遮罩,就會發生應用程式錯誤 (RR 格式的預設值取決於 NLS_TERRITORY 參數的值)。
當其中一個參數 NLS_DATE_FORMAT、NLS_TIMESTAMP_FORMAT 或 NLS_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 Guide 或 Oracle Database 26ai Database Globalization Support Guide 中的 Date and Time Parameters ,以及 Oracle Database 19c Database Globalization Support Guide 或 Oracle Database 26ai Database Globalization Support Guide 中的 NLS Data Dictionary Views 以瞭解詳細資訊。
DBMS_CLOUD 套裝程式 Avro、ORC 以及 Parquet 複雜類型
描述 Avro、ORC 和 Parquet 複雜資料類型與 Oracle 資料類型的對應。
自主 AI 資料庫支援複雜的資料類型,包括以下複雜類型:
- struct
- 清單
- 對應
- 工會
- 陣列
當您指定 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 陣列是 structs 的 array,每個項目都有 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 Guide 或 Oracle Database 26ai JSON Developer's Guide 中的 Simple Dot-Notation Access to JSON Data ,瞭解有關 "." 表示法的資訊。
請參閱 Oracle Database 19c JSON Developer's Guide 中的 SQL/JSON Function JSON_TABLE 或 Oracle 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 資料欄名稱中使用下列項目:
- 嵌入式空白
- 前導數字
- 前面的底線
- Oracle SQL 保留字
下表顯示各種類型的 Avro、ORC 和 Parquet 資料欄名稱,以及在外部表格的 Oracle 資料欄名稱中使用資料欄名稱的規則。
| Avro、ORC 或 Parquet 名稱 | CREATE TABLE 名稱 | Oracle 目錄 | 有效 SQL | 備註 |
|---|---|---|---|---|
| PART (部分) 或 PART | PART,PART,零件,PART | 部分 |
|
Oracle 的隱含大寫無引號的資料欄名稱。 |
| 訂單編號 | 「訂單編號」 | 訂單編號 | select "Ord No" |
當有內嵌空白時,需要雙引號,這也會保留字元大小寫。 |
| __index_key__ | "__index_key__" | __index_key__ | select "__index_key__" |
當前面的底線同時保留字元大小寫時,需要雙引號。 |
| 6Way | "6Way" | 6Way | select "6Way" |
有前置數字時,必須使用雙引號,這也會保留字元大小寫。 |
| CREATE、CREATE 或 CREATE 等等。(任何情況變動) 分割區、分割區、PARTITION 等等 (針對 Oracle 保留字) | 「建立」「分割區」 | 建立分割 |
|
Oracle SQL 保留字需有雙引號。這些是強制使用大寫的,但在 SQL 中的任何位置使用時,必須一律使用雙引號。 |
| ROWID、ROWID、ROWID 等等 (若為 ROWID,請參閱備註) | 列 ID |
|
若為 ROWID,任何混合或小寫的 ROWID 變化都會保留大小寫,且必須一律使用雙引號括住,並使用原始大小寫的變化。由於表格的 Oracle ROWID 固有衝突,如果您指定大寫 ROWID,系統會自動將它儲存為小寫 "ROWID",並在參照時一律加上雙引號。 |
注意事項
-
一般而言,可以在沒有雙引號的情況下參照外部表格中的資料欄名稱。
-
除非資料欄名稱中有內嵌的空白,否則資料欄名稱中的前導底線 ("_") 或前導數字 ("0" 到 "9"),會保留資料欄名稱的原始大小寫,而且必須一律以雙引號參考,並使用 Avro、ORC 或 Parquet 資料欄名稱的原始大小寫 (大寫、小寫或混合大小寫)。
-
使用
DBMS_CLOUD.CREATE_EXTERNAL_TABLE建立格式指定為avro、orc或parquet的外部表格之後,請使用 SQL*Plus 中的DESCRIBE命令來檢視表格的資料欄名稱。 -
在 Avro、ORC 或 Parquet 資料欄名稱中使用 Oracle SQL 保留字時,在 SQL 中的任何位置參照這些文字時,必須一律加上雙引號。請參閱 Oracle Database 26ai SQL Language Reference 中的 Oracle SQL Reserved Word 或 Oracle Database 26ai SQL Language Reference ,瞭解詳細資訊。