Copy to Hadoopを使用してOracle DatabaseからHadoopにデータを手動でコピーするには、次の手順を実行します。
Oracle Databaseサーバーで、Oracle Databaseに接続し、表データおよびメタデータを含むデータ・ポンプ形式ファイルを生成します。
「データ・ポンプ・ファイルの生成」を参照してください
ファイルをHadoopクラスタ上のHDFSにコピーします。
「HDFSへのファイルのコピー」を参照してください。
Apache Hiveに接続して、ファイルから外部表を作成します。
「Hive表の作成」を参照してください。
他のHive表と同じように、このHive表に問い合せます。
SQL CREATE TABLE
文には、ORACLE_DATAPUMP
アクセス・ドライバを指定する外部表を作成するための特別な句があります。この句に指定される情報により、アクセス・ドライバがOracleデータベース表のデータおよびメタデータを含むデータ・ポンプ形式ファイルを生成できます。
この項の内容は次のとおりです。
データ・ポンプ・ファイルは通常、あるデータベースから別のデータベースにデータおよびメタデータを移動するために使用されます。Copy to Hadoopは、このファイル形式を使用して、OracleデータベースからHDFSにデータをコピーします。
データ・ポンプ形式ファイルを生成するには、既存のOracle表から外部表を作成します。Oracle Databaseの外部表は、データベース外のデータの場所を識別および記述するOracle Databaseオブジェクトです。外部表は、アクセス・ドライバを使用して、データを解析および形式設定します。Copy to Hadoopでは、ORACLE_DATAPUMP
アクセス・ドライバを使用します。内部Oracle表からデータおよびメタデータをコピーして、外部表のデータ・ポンプ形式ファイルを移入します。
Oracle Databaseのデータベース・ディレクトリへの読取りおよび書込みアクセスが必要です。CREATE ANY DIRECTORY
システム権限を持つOracle Databaseユーザーのみディレクトリを作成できます。
この例は、Oracle Databaseサーバー(Oracle Exadata Database Machineなど)の/exportdir
ディレクトリを指すEXPORTDIR
という名前のデータベース・ディレクトリを作成します。
SQL> CREATE DIRECTORY exportdir AS '/exportdir';
データ・ポンプ形式ファイルのCREATE TABLE
文の基本的な構文は次のとおりです。
CREATE TABLE table_name ORGANIZATION EXTERNAL ( TYPE oracle_datapump DEFAULT DIRECTORY database_directory LOCATION ('filename1.dmp','filename2.dmp'...) ) PARALLEL n AS SELECT * FROM tablename;
この目的のために作成したデータベース・ディレクトリを識別します。「ターゲット・ディレクトリの識別」を参照してください。
作成するデータ・ポンプ・ファイルの名前をリストします。名前の数は、PARALLEL
句で指定される並列度(DOP)と一致する必要があります。それ以外の場合、DOPはファイルの数に削減されます。
ファイルの数および並列度は、データ・ポンプ形式ファイルを生成する場合にOracle Databaseのパフォーマンスに影響します。Hiveの問合せパフォーマンスには影響しません。
並列度(DOP)を設定します。Oracle DBAが使用を許可する最大数を使用します。デフォルトのDOPはシリアル処理の1です。大きい数値を使用すると並列処理が可能です。
この句の完全なSQL SELECT
構文を使用します。制限されていません。tablenameは、HDFSにコピーするOracle表を識別します。
Oracle Big Data SQLインストールは、Hadoopクライアント・ファイルをOracle Datatabaseサーバー(Oracle Exadata Database Machineなど)にインストールします。Hadoopクライアント・インストールでは、Hadoopコマンドを使用してデータ・ポンプ・ファイルをHDFSにコピーできます。HDFSディレクトリの書込み権限が必要です。
dmp
ファイルをHDFSにコピーするには、hadoop fs -put
コマンドを使用します。この例では、oracle
ユーザーが所有するHDFS customers
ディレクトリにファイルをコピーします。
$ hadoop fs -put customers*.dmp /user/oracle/customers
データ・ポンプ・ファイルのデータにアクセス可能にするには、データ・ポンプ・ファイルに対するHive外部表を作成します。Copy to Hadoopは、Hiveによるファイルの読取りが可能なSerDesを提供します。これらのSerDesは読取り専用であるため、これらを使用してファイルに書き込めません。
関連項目:
次のApache Hive LanguageManual DDL
外部表に対して、Hiveは表のメタデータをメタストアにロードします。データはLOCATION
句で識別される元の場所に残ります。HiveQL DROP TABLE
文を使用して外部表を削除すると、外部データは変更されずにメタデータのみ破棄されます。このため、Hiveは、Oracle Databaseと基本的に同じ方法で外部表を処理します。
外部表は、複数のプログラムで共有されるデータ・ソースをサポートします。この場合、Oracle Databaseを使用してデータを更新し、新しいファイルを生成します。Hiveメタデータを変更せずに古いHDFSファイルを更新されたファイルで置換できます。
データ・ポンプ形式ファイルで使用するHive外部表を作成するためのHive CREATE TABLE
文の基本的な構文は、次のとおりです。
CREATE EXTERNAL TABLE tablename ROW FORMAT SERDE 'oracle.hadoop.hive.datapump.DPSerDe' STORED AS INPUTFORMAT 'oracle.hadoop.hive.datapump.DPInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'hdfs_directory'
この例は、Copy to Hadoopを使用してOracle表からHive表を作成するプロセスのすべての手順を示します。
Oracle表は、Sales History (SH)サンプル・スキーマから使用します。CUSTOMERS
表は、名前、住所、電話番号、生年月日および借入限度額を含む個々の顧客に関する詳細情報を提供します。COUNTRIES
表は、国のリストを提供し、地域および小地域を識別します。
この問合せは、CUSTOMERS
表の一部のデータを示します。
SELECT cust_first_name first_name, cust_last_name last_name, cust_gender gender, cust_year_of_birth birth FROM customers ORDER BY cust_city, last_name FETCH FIRST 10 ROWS ONLY;
問合せは次の行を返します:
FIRST_NAME LAST_NAME GENDER BIRTH --------------- -------------------- ------ ---------- Lise Abbey F 1963 Lotus Alden M 1958 Emmanuel Aubrey M 1933 Phil Ball M 1956 Valentina Bardwell F 1965 Lolita Barkley F 1966 Heloise Barnes M 1980 Royden Barrett M 1937 Gilbert Braun M 1984 Portia Capp F 1948
この例を複製するには、Oracle Databaseのサンプル・スキーマをインストールして、SH
ユーザーとして接続します。
これらのSQL文は、EXPDIR
という名前のローカル・データベース・ディレクトリを作成し、SH
ユーザーにアクセス権を付与します。
SQL> CREATE DIRECTORY expdir AS '/expdir'; Directory created. SQL> GRANT READ, WRITE ON DIRECTORY expdir TO SH; Grant succeeded.
次の例は、データ・ポンプ・ファイルの作成方法およびその内容の確認方法を示します。
Copy to Hadoopでは、例に示す構文しかサポートされません。エクスポート・ユーティリティまたはOracle Data Pumpで作成されるデータ・ポンプ・ファイルとの互換性はありません。
この例は、CUSTOMERS
表からデータ・ポンプ形式ファイルを作成する非常に簡単なSQLコマンドを示します。表全体を選択して、ローカル/expdir
ディレクトリのcustomers.dmp
という名前の単一の出力ファイルを生成します。
CREATE TABLE export_customers ORGANIZATION EXTERNAL ( TYPE oracle_datapump DEFAULT DIRECTORY expdir LOCATION('customers.dmp') ) AS SELECT * FROM customers;
次の例は、より複雑な構文を示しています。COUNTRY_ID
列に関してCUSTOMERS
およびCOUNTRIES
表を結合して、国名を示します。また、行をアメリカの顧客に制限します。コマンドは、ローカル/expdir
ディレクトリにamericas1.dmp
およびamericas2.dmp
という名前の2つの出力ファイルをパラレルに生成します。
CREATE TABLE export_americas ORGANIZATION EXTERNAL ( TYPE oracle_datapump DEFAULT DIRECTORY expdir LOCATION('americas1.dmp', 'americas2.dmp') ) PARALLEL 2 AS SELECT a.cust_first_name first_name, a.cust_last_name last_name, a.cust_gender gender, a.cust_year_of_birth birth, a.cust_email email, a.cust_postal_code postal_code, b.country_name country FROM customers a, countries b WHERE a.country_id=b.country_id AND b.country_region='Americas' ORDER BY a.country_id, a.cust_postal_code;
Hadoopにコピーする前に出力データ・ファイルの内容を確認できます。前のCREATE TABLE
文で、他の表と同じように説明および問い合せできるEXPORT_AMERICAS
という名前の外部表を作成しました。
DESCRIBE
文は、列の選択および変更された名前を示します。
SQL> DESCRIBE export_americas;
Name Null? Type
------------------------- -------- -----------------
FIRST_NAME NOT NULL VARCHAR2(20)
LAST_NAME NOT NULL VARCHAR2(40)
GENDER NOT NULL CHAR(1)
BIRTH NOT NULL NUMBER(4)
EMAIL VARCHAR2(50)
POSTAL_CODE NOT NULL VARCHAR2(10)
COUNTRY NOT NULL VARCHAR2(40)
次のようなSELECT
文は、データのサンプルを示します。
SELECT first_name, last_name, gender, birth, country FROM export_americas WHERE birth > 1985 ORDER BY last_name FETCH FIRST 5 ROWS ONLY;
FIRST_NAME LAST_NAME GENDER BIRTH COUNTRY --------------- -------------------- ------ ---------- ------------------------ Opal Aaron M 1990 United States of America KaKit Abeles M 1986 United States of America Mitchel Alambarati M 1987 Canada Jade Anderson M 1986 United States of America Roderica Austin M 1986 United States of America
次のコマンドはローカルexpdir
ディレクトリのファイルをリストし、customers
という名前のHadoopサブディレクトリを作成し、そこにファイルをコピーします。ユーザーは、oracle
ファイル・システム・ユーザーとしてHadoopクラスタ(Oracle Big Data Applianceなど)に接続されます。
$ cd /expdir $ ls americas*.dmp americas1.dmp americas2.dmp $ hadoop fs -mkdir customers $ hadoop fs -put *.dmp customers $ hadoop fs -ls customers Found 2 items -rw-r--r-- 1 oracle oracle 798720 2014-10-13 17:04 customers/americas1.dmp -rw-r--r-- 1 oracle oracle 954368 2014-10-13 17:04 customers/americas2.dmp
このHiveQL文は、Copy to HadoopのSerDesを使用して外部表を作成します。LOCATION
句は、データ・ポンプ・ファイルを含むHadoopディレクトリへのフル・パスを識別します。
CREATE EXTERNAL TABLE customers ROW FORMAT SERDE 'oracle.hadoop.hive.datapump.DPSerDe' STORED AS INPUTFORMAT 'oracle.hadoop.hive.datapump.DPInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION '/user/oracle/customers';
DESCRIBE
コマンドは、CUSTOMERS
外部表の列を示します。
hive> DESCRIBE customers;
OK
first_name varchar(20) from deserializer
last_name varchar(40) from deserializer
gender char(1) from deserializer
birth int from deserializer
email varchar(50) from deserializer
postal_code varchar(10) from deserializer
country varchar(40) from deserializer