DBMS_CLOUD Avro、ORCおよびParquetのサポート
Avro、ORCまたはParquet用のDBMS_CLOUDパッケージ・フォーマット・オプション
DBMS_CLOUD
のformat引数では、ソース・ファイルのフォーマットを指定します。
format引数を指定するには:
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')
書式オプション | 説明 | 構文 |
---|---|---|
|
正規表現パターンは、URI内のファイル名またはサブフォルダ・パスでのみサポートされ、パターン一致は 外部表の場合、このオプションは、オブジェクト・ストレージのファイルに作成された表でのみサポートされます。 たとえば次のようにします。
|
デフォルト値: |
type |
ファイルのタイプを指定します。 |
|
|
スキーマが 列名は、Avro、ORCまたはParquetに含まれるものと一致します。データ型は、Avro、ORCまたはParquetデータ型からOracleデータ型に変換されます。すべての列が表に追加されます。 値 値 デフォルト: ノート: Avro、ORCまたはParquetフォーマット・ファイルの場合、 |
|
DBMS_CLOUD Oracleデータ型へのAvroパッケージのマッピング
Avroデータ型とOracleデータ型のマッピングについて説明します。
ノート:
複合タイプ(マップ、配列、構造体など)は、Oracle Database 19c以降でサポートされています。Avro複合型の使用の詳細は、DBMS_CLOUDパッケージのAvro、ORCおよびParquet複合型を参照してください。Avroタイプ | Oracleタイプ |
---|---|
INT | NUMBER(10) |
LONG | NUMBER(19) |
ブール | NUMBER(1) |
UTF8 BYTE_ARRAY | RAW(2000) |
FLT | BINARY_FLOAT |
DBL | BINARY_DOUBLE |
デシマル(p) | 番号(p) |
DECIMAL(p、s) | NUMBER(p,s) |
DATE | DATE |
STRING | VARCHAR2 |
TIME_MILLIS | VARCHAR2(20バイト) |
TIME_MICROS | VARCHAR2(20バイト) |
TIMESTAMP_MILLIS | タイムスタンプ(3) |
TIMESTAMP_MICROS | タイムスタンプ(6) |
ENUM | VARCHAR2(n): nは、AVRO ENUMの使用可能な値の実際の最大長です |
DURATION | RAW(2000) |
FIXED | RAW(2000) |
NULL | VARCHAR2(1)バイト |
Avro複合型の使用の詳細は、DBMS_CLOUDパッケージのAvro、ORCおよびParquet複合型を参照してください。
DBMS_CLOUD Oracleデータ型へのORCパッケージのマッピング
ORCデータ型とOracleデータ型のマッピングについて説明します。
ORC複合型の使用の詳細は、DBMS_CLOUDパッケージのAvro、ORCおよびParquet複合型を参照してください。
ORC型 | Oracleタイプ | その他の情報入手先 |
---|---|---|
配列 | VARCHAR2(n) JSON形式 | DBMS_CLOUDパッケージAvro、ORCおよびParquet複合型 |
bigint (64ビット) | NUMBER(19) | |
binary | BLOB | |
boolean (1ビット) | NUMBER(1) | |
文字 | CHAR(n) | |
日付 | DATE | |
倍精度浮動小数点 | BINARY_DOUBLE | |
浮動小数 | BINARY_FLOAT | |
int (32ビット) | NUMBER(10) | |
list | VARCHAR2(n) JSON形式 | DBMS_CLOUDパッケージAvro、ORCおよびParquet複合型 |
マップ | VARCHAR2(n) JSON形式 | DBMS_CLOUDパッケージAvro、ORCおよびParquet複合型 |
smallint (16ビット) | NUMBER(5) | |
文字列 | VARCHAR2(4000) | |
struct | VARCHAR2(n) JSON形式 | DBMS_CLOUDパッケージAvro、ORCおよびParquet複合型 |
タイムスタンプ | TIMESTAMP | |
tinyint (8ビット) | NUMBER(3) | |
UNION | VARCHAR2(n) JSON形式 | DBMS_CLOUDパッケージAvro、ORCおよびParquet複合型 |
varchar | VARCHAR2(n) |
DBMS_CLOUDパッケージParquetからOracleデータ型へのマッピング
Parquetデータ型とOracleデータ型のマッピングについて説明します。
ノート:
複合タイプ(マップ、配列、構造体など)は、Oracle Database 19c以降でサポートされています。Parquet複合型の使用の詳細は、DBMS_CLOUDパッケージのAvro、ORCおよびParquet複合型を参照してください。Parquetタイプ | Oracleタイプ |
---|---|
UINT_64 | NUMBER(20) |
INT_64 | NUMBER(19) |
UINT_32 | NUMBER(10) |
INT_32 | NUMBER(10) |
UINT_16 | NUMBER(5) |
INT_16 | NUMBER(5) |
UINT_8 | NUMBER(3) |
INT_8 | NUMBER(3) |
ブール | NUMBER(1) |
UTF8 BYTE_ARRAY | VARCHAR2(4000バイト) |
FLT | BINARY_FLOAT |
DBL | BINARY_DOUBLE |
デシマル(p) | 番号(p) |
DECIMAL(p、s) | NUMBER(p,s) |
DATE | DATE |
STRING | VARCHAR2(4000) |
TIME_MILLIS | VARCHAR2(20バイト) |
TIME_MILLIS_UTC | VARCHAR2(20バイト) |
TIME_MICROS | VARCHAR2(20バイト) |
TIME_MICROS_UTC | VARCHAR2(20バイト) |
TIMESTAMP_MILLIS | タイムスタンプ(3) |
TIMESTAMP_MILLIS_UTC | タイムスタンプ(3) |
TIMESTAMP_MICROS | タイムスタンプ(6) |
TIMESTAMP_MICROS_UTC | タイムスタンプ(6) |
TIMESTAMP_NANOS | タイムスタンプ(9) |
Parquet複合型の使用の詳細は、DBMS_CLOUDパッケージのAvro、ORCおよびParquet複合型を参照してください。
DBMS_CLOUDパッケージのOracleデータ型からParquetへのマッピング
Oracleデータ型とParquetデータ型のマッピングについて説明します。
Oracleタイプ | Parquetタイプ |
---|---|
BINARY_DOUBLE | DBL |
BINARY_FLOAT | FLT |
DATE | DATE |
NUMBER(p,s) | DECIMAL(p、s) |
番号(p) | デシマル(p) |
タイムスタンプ(3) | TIMESTAMP_MILLIS |
タイムスタンプ(3) | TIMESTAMP_MILLIS_UTC |
タイムスタンプ(6) | TIMESTAMP_MICROS |
タイムスタンプ(6) | TIMESTAMP_MICROS_UTC |
タイムスタンプ(9) | TIMESTAMP_NANOS |
VARCHAR2(4000) | STRING |
NLSセッション・パラメータ
NLSセッション・パラメータNLS_DATE_FORMAT
、NLS_TIMESTAMP_FORMAT
、NLS_TIMESTAMP_TZ_FORMAT
およびNLS_NUMERIC_CHARACTERS
は、日付、タイムスタンプ、タイムゾーン付きタイムスタンプ書式、および小数マーカー付きタイムスタンプの基数セパレータを、これらの列タイプの表が問い合せられる場合にどのように表示するかを定義します。
また、DBMS_CLOUD.EXPORT_DATA
を使用してデータをエクスポートし、Parquet出力を指定した場合、Autonomous Databaseは、これらのパラメータの値をNLS_SESSION_PARAMETERS
表から読み取ります。Autonomous Databaseでは、これらの値を使用して、Oracleデータ型DATE
またはTIMESTAMP
をParquet型に変換します。
NLS_SESSION_PARAMETERS
パラメータでは、RR
書式マスク(2文字の年指定)がサポートされています。
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
datattypeの列に適用されます。NLS_TIMESTAMP_TZ_FORMAT
が設定されている場合、TIMESTAMP WITH TIME ZONE
データ型の列に適用されます。
詳細は、『Oracle Database 19cデータベース・グローバリゼーション・サポート・ガイド』の日時パラメータに関する項または『Oracle Database 23aiデータベース・グローバリゼーション・サポート・ガイド』の『NLSデータ・ディクショナリ・ビュー』および『Oracle Database 19cデータベース・グローバリゼーション・サポート・ガイド』の『Oracle Database 23aiデータベース・グローバリゼーション・サポート・ガイド』を参照してください。
DBMS_CLOUDパッケージのAvro、ORCおよびParquet複合型
Avro、ORCおよびParquet複合データ型とOracleデータ型のマッピングについて説明します。
Autonomous Databaseは、次の複合型を含む複合データ型をサポートしています:
-
struct
-
list
-
マップ
-
UNION
-
配列
Avro、ORCまたはParquetのソース・ファイル・タイプを指定するときに、ソース・ファイルに複合列が含まれる場合、Autonomous Databaseの問合せは複合列に対してJSONを返します。これにより、問合せ結果の処理が簡素化されます。つまり、Oracleの強力なJSON解析機能をファイル・タイプおよびデータ・タイプのすべてに一貫して使用できます。次の表に、Autonomous Databaseの複合型の形式を示します:
ノート:
複合フィールドはVARCHAR2
列にマップされ、VARCHAR2
サイズ制限が適用されます。
タイプ | Parquet | オーク | Avro | Oracle |
---|---|---|---|---|
リスト: 一連の値 | List | List | 配列 | VARCHAR2 (JSON形式)
|
マップ: 単一キーを持つオブジェクトのリスト | マップ | マップ | マップ | VARCHAR2 (JSON形式)
|
Union: 異なるタイプの値 | 連絡不可 | UNION | UNION | VARCHAR2 (JSON形式)
|
Object: 0個以上のキーと値のペア | Struct | Struct | レコード | 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>
各movieは、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開発者ガイドのJSONデータへの単純なドット表記法アクセスまたはOracle Database 23ai JSON開発者ガイドを参照してください。
JSON_TABLE
の詳細は、Oracle Database 19c JSON開発者ガイドのSQL/JSONファンクションJSON_TABLEまたはOracle Database 23ai JSON開発者ガイドを参照してください。
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
は、配列の値ごとに行を作成し、外部結合を検討し、structを解析してgenreの名前を抽出します。これにより、次の出力が生成されます:
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、 and Parquet列名では次のものがサポートされていますが、外部表のOracle SQL参照には二重引用符の使用が必要になる場合があります。したがって、使用しやすくし、列名の参照時に二重引用符を使用しなくて済むように、可能であればAvro、ORCおよびParquetの列名で使用しないでください:
-
埋込みの空白
-
先頭の数値
-
先頭のアンダースコア
-
Oracle SQLの予約語
次の表に、Avro、ORCおよびParquet列名の様々なタイプと、その列名を外部表のOracle列名で使用するためのルールを示します。
Avro、 ORC、 or Parquetの名前 | CREATE TABLE名 | Oracleカタログ | 有効なSQL | ノート |
---|---|---|---|---|
part、PartまたはPART | part、Part、PART | 分断 |
|
Oracleは、引用符なしの列名を暗黙的に大文字にします |
オーダー番号 | "オーダー番号" | オーダー番号 | select "Ord No" |
二重引用符は埋込みの空白がある場合に必要になり、文字の大/小文字も維持されます |
__索引キー__ | "__index_key__" | __索引キー__ | select "__index_key__" |
二重引用符は先頭にアンダースコアがある場合に必要になり、文字の大/小文字も維持されます |
6Way | "6Way" | 6Way | select "6Way" |
先頭の数字がある場合は二重引用符が必要であり、文字の大/小文字も維持されます |
CREATE、CREATEまたはCREATEなど。(大/小文字の違いがある) PARTITION、PARTITION、PARTITIONなど(Oracleの予約語の場合) | "作成" "パーティション" | パーティションの作成 |
|
Oracle SQLの予約語を囲む二重引用符が必要です。これらは強制的に大文字になりますが、SQLで使用する場合は常に二重引用符で囲む必要があります |
ROWID、ROWID、ROWidなど(ROWIDについてはノートを参照) | ROWID |
|
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 23ai SQL言語リファレンスのOracle SQL予約語またはOracle Database 23ai SQL言語リファレンスを参照してください。