3 Oracle SQL Connector for Hadoop Distributed File System

この章では、Oracle SQL Connector for Hadoop Distributed File System (HDFS)を使用して、HadoopとOracle Database間のデータ・アクセスを容易にする方法について説明します。

この章は次の項で構成されています:

Oracle SQL Connector for HDFSについて

Oracle SQL Connector for HDFSを使用する場合、Apache Hadoopに存在する次の形式のデータへのアクセスやデータの分析にOracle Databaseを使用できます。

  • HDFS形式のデータ・ポンプ・ファイル

  • HDFS形式のデリミタ付きテキスト・ファイル

  • Apache Hive表のデリミタ付きテキスト・ファイル

その他のファイル形式(JSONファイルなど)の場合、入力ファイルをデリミタ付きテキストとして新規のHive表にステージングしてから、Oracle SQL Connector for HDFSを使用できます。パーティション化Hive表がサポートされているため、Oracle Databaseで、Hive表全体ではなく、Hive表パーティションのサブセットを表すことができます。

Oracle SQL Connector for HDFSでは、外部表およびデータベース・ビューを使用して、Hive表およびHDFSのデリミタ付きテキスト・ファイルとデータ・ポンプ・ファイルに対する読取りアクセス権をOracle Databaseに提供します。外部表は、データベース外のデータの場所を識別するOracle Databaseオブジェクトです。Oracle Databaseは、外部表の作成時に指定されたメタデータを使用してデータにアクセスします。Oracle SQL Connector for HDFSは、パーティション化Hive表へのアクセスをサポートするように外部表にデータベース・ビューを作成します。外部表またはビューへの問合せによって、データがOracleデータベースの表に格納されている場合と同様に、HDFSやHive表に格納されているデータにアクセスできます。

これらのオブジェクトをOracle Databaseに作成するには、Oracle SQL Connector for HDFSで提供されるExternalTableコマンドライン・ツールを使用します。ExternalTableに、Hadoopのデータソースに関する情報とOracle Databaseのスキーマに関する情報を指定します。この情報は、ExternalTableコマンドに対するオプションとして、またはXMLファイルで指定します。ExternalTableコマンドライン・ツールは、シェルまたはSQL Developerから使用できます。

外部表の準備が完了すると、他のデータベース表の場合と同じ方法でデータに問合せを実行できます。HDFSやHive表のデータに問い合せたり、そのデータを他のデータベースに存在するデータと結合したりすることもできます。

SQLを使用してOracleデータベース表にデータのバルク・ロードを実行できます。頻繁に問い合せるデータのすべてまたは一部をOracleデータベースに格納することもできます。Oracle SQL Connector for HDFSは、Oracleデータベース上で実行されるHadoopクライアントとして機能し、外部表プリプロセッサhdfs_streamを使用してHDFSのデータにアクセスします。Oracle Shell for Hadoop Loadersには、1ステップで外部表を作成してバルク・ロードを実行するコマンドがあります。

Oracle SQL Connector for HDFSのインタフェース

Oracle SQL Connector for HDFSには次の2つの使用方法があります。

  • Oracle Shell for Hadoop Loaders (OHSH)

    OHSHは、Oracle SQL Connector for HDFS (OSCH)を使用する場合にお薦めの方法です。これには、Oracle SQL Connector for HDFSなどの各種リソースを使用してHadoopとOracle Databaseの間でデータを移動するためのコマンドライン・インタフェース(単純なコマンド構文でスクリプト化も可能)が含まれています。

  • Oracle SQL Connector for HDFSのExternalTableコマンドライン・ツール

    このオプションは、OHSHでサポートされていない機能を使用する必要がある場合に検討してください。ほとんどの場合、OHSHで十分です。

ここからは、ExternalTableコマンドライン・ユーティリティでOracle SQL Connector for HDFSを使用する方法について説明します。OHSHでOracle SQL Connector for HDFSを使用する方法の詳細は、「Oracle Shell for Hadoop Loaders」を参照してください。

Oracle SQL Connector for HDFSを使用する前に

次に、Oracle SQL Connector for HDFSを使用する場合の基本的なステップを示します。

  1. Oracle SQL Connector for HDFSがインストールされているシステムにログインします。Oracle SQL Connector for HDFSは、Hadoopクライアントまたはエッジ・ノードにインストールすることをお薦めします。また、Oracle Databaseシステムにインストールされていることが必要です。
  2. 初めてOracle SQL Connector for HDFSを使用する場合は、ソフトウェアが構成されていることを確認します。

    「システムへのOracle SQL Connector for HDFSの構成」を参照してください。環境が特有である場合は、hdfs_streamの編集も必要になる場合があります。Oracle SQL Connector for HDFSのインストールと構成を参照してください。

  3. セキュアなクラスタに接続する場合は、自分自身を認証するためにkinitを実行します。
  4. 接続とデータソースを指定するXMLドキュメントを作成します(ExternalTableコマンドにこれらのプロパティを指定していない場合)。
  5. ExternalTableコマンドを含むシェル・スクリプトを作成します。
  6. シェル・スクリプトを実行します。
  7. ジョブが失敗した場合、出力の診断メッセージを使用してエラーを特定し、修正します。失敗した時点のジョブの進捗状況によっては、スクリプトを再実行する前にOracleデータベースから表の定義を削除する必要があります。
  8. ジョブが成功した後、外部表の所有者としてOracle Databaseに接続します。この表に問い合せて、データにアクセスできることを確認します。
  9. データの問合せが頻繁に行われる場合は、データベース表にロードして問合せのパフォーマンスを向上させることができます。外部表には索引やパーティションはありません。

    データを表にロードするときに圧縮する場合は、COMPRESSオプションを使用して表を作成します。

  10. Oracle SQL Connector for HDFSによって作成されたOracle Databaseオブジェクトを削除するには、-dropコマンドを使用します。

例3-1 Oracle DatabaseからのHDFSデータ・ファイルへのアクセス

次に、これらのステップを示します。

$ cat moviefact_hdfs.sh
# Add environment variables
export OSCH_HOME="/u01/connectors/orahdfs-<version>"
 
hadoop jar $OSCH_HOME/jlib/orahdfs.jar \
       oracle.hadoop.exttab.ExternalTable \
       -conf /home/oracle/movies/moviefact_hdfs.xml \
       -createTable

$ cat moviefact_hdfs.xml
<?xml version="1.0"?>
 <configuration>
    <property>
      <name>oracle.hadoop.exttab.tableName</name>
      <value>MOVIE_FACTS_EXT</value>
    </property>
    <property>
      <name>oracle.hadoop.exttab.locationFileCount</name>
      <value>4</value>
    </property>
    <property>
      <name>oracle.hadoop.exttab.dataPaths</name>
      <value>/user/oracle/moviework/data/part*</value>
    </property>
    <property>
      <name>oracle.hadoop.exttab.fieldTerminator</name>
      <value>\u0009</value>
    </property>
    <property>
      <name>oracle.hadoop.exttab.defaultDirectory</name>
      <value>MOVIEDEMO_DIR</value>
    </property>
    <property>
      <name>oracle.hadoop.exttab.nullIfSpecifier</name>
      <value>\N</</value>
    </property>
    <property>
      <name>oracle.hadoop.exttab.columnNames</name>
      <value>CUST_ID,MOVIE_ID,GENRE_ID,TIME_ID,RECOMMENDED,ACTIVITY_ID,RATING,SALES</value>
    </property>
    <property>
      <name>oracle.hadoop.exttab.colMap.TIME_ID.columnType</name>
      <value>TIMESTAMP</value>
    </property>
    <property>
      <name>oracle.hadoop.exttab.colMap.timestampMask</name>
      <value>YYYY-MM-DD:HH:MI:SS</value>
    </property>
    <property>
      <name>oracle.hadoop.exttab.colMap.RECOMMENDED.columnType</name>
      <value>NUMBER</value>
    </property>
    <property>
      <name>oracle.hadoop.exttab.colMap.ACTIVITY_ID.columnType</name>
      <value>NUMBER</value>
    </property>
    <property>
      <name>oracle.hadoop.exttab.colMap.RATING.columnType</name>
      <value>NUMBER</value>
    </property>
    <property>
      <name>oracle.hadoop.exttab.colMap.SALES.columnType</name>
      <value>NUMBER</value>
    </property>
    <property>
      <name>oracle.hadoop.exttab.sourceType</name>
      <value>text</value>
    </property>
    <property>
      <name>oracle.hadoop.connection.url</name>
      <value>jdbc:oracle:thin:@localhost:1521:orcl</value>
    </property>
    <property>
      <name>oracle.hadoop.connection.user</name>
      <value>MOVIEDEMO</value>
    </property>  
</configuration>

$ sh moviefact_hdfs.sh
Oracle SQL Connector for HDFS Release 3.4.0 - Production
 
Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
 
[Enter Database Password: password]
The create table command succeeded.
 
CREATE TABLE "MOVIEDEMO"."MOVIE_FACTS_EXT"
(
 "CUST_ID"                        VARCHAR2(4000),
 "MOVIE_ID"                       VARCHAR2(4000),
 "GENRE_ID"                       VARCHAR2(4000),
 "TIME_ID"                        TIMESTAMP(9),
 "RECOMMENDED"                    NUMBER,
 "ACTIVITY_ID"                    NUMBER,
 "RATING"                         NUMBER,
 "SALES"                          NUMBER
)
ORGANIZATION EXTERNAL
( 
   TYPE ORACLE_LOADER
   DEFAULT DIRECTORY "MOVIEDEMO_DIR"
   ACCESS PARAMETERS
   (
     RECORDS DELIMITED BY 0X'0A'
     CHARACTERSET AL32UTF8
     PREPROCESSOR "OSCH_BIN_PATH":'hdfs_stream'
     FIELDS TERMINATED BY 0X'09'
     MISSING FIELD VALUES ARE NULL
     (
       "CUST_ID" CHAR(4000),
       "MOVIE_ID" CHAR(4000),
       "GENRE_ID" CHAR(4000),
       "TIME_ID" CHAR,
       "RECOMMENDED" CHAR,
       "ACTIVITY_ID" CHAR,
       "RATING" CHAR,
       "SALES" CHAR
     )
   )
   LOCATION
   (
     'osch-20141114064206-5250-1',
     'osch-20141114064206-5250-2',
     'osch-20141114064206-5250-3',
     'osch-20141114064206-5250-4'
   )
) PARALLEL REJECT LIMIT UNLIMITED;
 
The following location files were created.
 
osch-20141114064206-5250-1 contains 1 URI, 12754882 bytes
 
    12754882 hdfs://localhost.localdomain:8020/user/oracle/moviework/data/part-00001
 
osch-20141114064206-5250-2 contains 1 URI, 438 bytes
 
         438 hdfs://localhost.localdomain:8020/user/oracle/moviework/data/part-00002
 
osch-20141114064206-5250-3 contains 1 URI, 432 bytes
 
         432 hdfs://localhost.localdomain:8020/user/oracle/moviework/data/part-00003
 
osch-20141114064206-5250-4 contains 1 URI, 202 bytes
 
         202 hdfs://localhost.localdomain:8020/user/oracle/moviework/data/part-00004

$ sqlplus moviedemo
 
SQL*Plus: Release 12.1.0.1.0 Production on Fri Apr 18 09:24:18 2014
 
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
 
Enter password: password
Last Successful login time: Thu Apr 17 2014 18:42:01 -05:00
 
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
 
SQL> DESCRIBE movie_facts_ext;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 CUST_ID                                            VARCHAR2(4000)
 MOVIE_ID                                           VARCHAR2(4000)
 GENRE_ID                                           VARCHAR2(4000)
 TIME_ID                                            TIMESTAMP(9)
 RECOMMENDED                                        NUMBER
 ACTIVITY_ID                                        NUMBER
 RATING                                             NUMBER
 SALES                                              NUMBER

SQL> CREATE TABLE movie_facts AS SELECT * FROM movie_facts_ext;
 
Table created.

SQL> SELECT movie_id, time_id, recommended, rating FROM movie_facts WHERE rownum < 5;
 
MOVIE_ID TIME_ID                          RECOMMENDED     RATING
-------- -------------------------------- ----------- ----------
205      03-DEC-10 03.14.54.000000000 AM            1          1
77       14-AUG-11 10.46.55.000000000 AM            1          3
116      24-NOV-11 05.43.00.000000000 AM            1          5
141      01-JAN-11 05.17.57.000000000 AM            1          4

システムへのOracle SQL Connector for HDFSの構成

ノート:

Oracle Big Data ServiceでOracle SQL Connector for HDFSを使用する手順は、Oracle Big Data Serviceの使用Big Data ConnectorsおよびCopy to Hadoopを使用したBig Data Serviceとデータベース・インスタンスの間でのデータのコピーに関する項を参照してください。

次に説明するように、Oracle DatabaseシステムまたはHadoopクラスタのどちらかでOracle SQL Connector for HDFSが提供するExternalTableコマンドライン・ツールを実行できます。

  • Hiveソースの場合は、HadoopクラスタのノードまたはクラスタのHadoopクライアントとして設定されているシステムにログインします。

  • テキストおよびデータ・ポンプ形式ファイルの場合は、Oracle DatabaseシステムまたはHadoopクラスタのノードにログインします。

Oracle SQL Connector for HDFSでは、ツールを実行するためにログインするシステムのHADOOP_CLASSPATH環境変数に情報を追加する必要があります。この追加設定は、システム管理者がアカウントの作成時に行う場合と、自分で行う必要がある場合があります。「OSCHユーザーのOSレベル要件」を参照してください。

環境変数の設定:

  • HADOOP_CLASSPATHにOracle SQL Connector for HDFSのJARファイルへのパスが含まれていることを確認します。

    path/orahdfs-<version>/jlib/*
    
  • Hiveデータソースを使用しているHadoopクラスタにログインする場合は、HADOOP_CLASSPATHにHiveのJARファイルとconfディレクトリが含まれていることも確認します。次に例を示します。

    /usr/lib/hive/lib/*
    /etc/hive/conf
    
  • 便宜上、OSCH_HOME環境変数を作成することもできます。Oracle Big Data Applianceにこの環境変数を設定するBashコマンドを次に示します。

    $ export OSCH_HOME="/opt/oracle/orahdfs-<version>"
    

関連項目:

  • 両方のシステムにソフトウェアをインストールし、ユーザー・アカウントを設定する手順については、「Oracle SQL Connector for Hadoop Distributed File Systemの設定」を参照してください。

  • Oracle SQL Connector for HDFSに関する既知の問題の詳細は、OSCH_HOME/doc/README.txtを参照してください。

Oracle Big Data ApplianceおよびOracle ExadataとのOracle SQL Connector for HDFSの使用

Oracle SQL Connector for HDFSは、org.apache.hadoop.util.Toolインタフェースでサポートされる汎用のコマンドライン引数を受け入れるコマンドライン・ユーティリティです。また、Oracle外部表のプリプロセッサも提供します。Oracle Big Data Applianceと併用する場合のOracle Exadata Database Machineの構成手順については、Oracle Big Data Applianceと併用する場合のOracle Exadata Database Machineの構成に関する項を参照してください。

ExternalTableコマンドライン・ツールの使用

Oracle SQL Connector for HDFSには、ExternalTableというコマンドライン・ツールがあります。この項では、このツールの基本的な使用方法について説明します。データソース形式に固有のコマンド構文については、「外部表の作成」を参照してください。

ExternalTableの概要

ExternalTableツールでは、いくつかのプロパティの値を使用して次のタスクを行います。

  • 外部表の作成

  • 場所ファイルの移入

  • 既存の外部表への場所ファイルの公開

  • 場所ファイルのリスト

  • 外部表の説明

これらのプロパティ値はXMLドキュメントに指定することも、コマンドラインで個々に指定することもできます。

ExternalTableコマンドライン・ツールの構文

これは、hadoopコマンドを使用して実行するExternalTableコマンドライン・ツールの構文全体です。

hadoop jar OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
[-conf config_file]... \ 
[-D property=value]... \
-createTable [--noexecute [--output filename.sql]] 
  | -drop [--noexecute]
  | -describe
  | -publish [--noexecute] 
  | -listlocations [--details]
  | -getDDL

OSCH_HOME環境変数を作成することも、コマンド構文のOSCH_HOMEをOracle SQL Connector for HDFSのインストール・ディレクトリのフル・パスに置き換えることもできます。Oracle Big Data Applianceの場合、このディレクトリは次のようになります。

/opt/oracle/orahdfs-<version>

たとえば、ExternalTableコマンドライン・ツールで次のようなコマンドを実行できます。

hadoop jar /opt/oracle/orahdfs-<version>/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
     .
     .
     .

汎用オプションおよびユーザー・コマンド

-conf config_file

実行するコマンドで必要なプロパティを含むXML構成ファイルの名前を特定します。

-D property=value

特定のプロパティに値を割り当てます。

-createTable [--noexecute [--output filename]]

外部表定義を作成し、データのURIを外部表の場所ファイルに公開します。出力レポートに、外部表の作成に使用されるDDLと、場所ファイルの内容が示されます。Oracle SQL Connector for HDFSでは、データベースもチェックして、必要なデータベース・ディレクトリが存在し、ユーザーに必要な権限が付与されていることを確認します。

パーティション化Hive表の場合は、Oracle SQL Connector for HDFSによって外部表、ビューおよびメタデータ表が作成されます。表3-2を参照してください。

パーティション化Hive表のメタデータ表名を指定するか、その他すべてのデータソースの外部表名を指定します。

--noexecuteオプションを使用して、コマンドの実行計画を表示します。操作は実行されませんが、レポートには、実行計画の詳細とエラーが表示されます。--outputオプションを使用すると、-createTableコマンドからDDL表がファイルに書き込まれます。最初に、-createTableコマンドを--noexecuteを指定して実行することをお薦めします。

-drop [--noexecute]

特定のデータソースをサポートするようにOracle SQL Connector for HDFSによって作成された、1つ以上のOracle Databaseオブジェクトを削除します。パーティション化Hive表のメタデータ表名を指定するか、その他すべてのデータソースの外部表名を指定します。Oracle SQL Connector for HDFSが作成していない表またはビューを削除しようとするとエラーが発生します。

--noexecuteオプションを使用して、削除するオブジェクトをリストしてください。

-describe

Oracle SQL Connector for HDFSによって作成されたOracle Databaseオブジェクトに関する情報を提供します。-getDDL-listLocationsではなく、このコマンドを使用します。

-publish [--noexecute]

既存の外部表の場所ファイルにデータのURIを公開します。既存の外部表から新しいデータ・ファイルにアクセスできるように、新しいデータ・ファイルを追加した後にこのコマンドを使用します。

--noexecuteオプションを使用して、コマンドの実行計画を表示します。操作は実行されませんが、レポートには、計画されているSQL ALTER TABLEコマンドと場所ファイルが表示されます。また、エラーも示されます。

最初に、-publishコマンドを--noexecuteを指定して実行することをお薦めします。

「外部表の更新」を参照してください。

-listLocations [--details]

場所ファイルの内容をテキストで表示します。このコマンドで--detailsオプションを指定すると、詳細なリストが示されます。このコマンドはリリース3.0で非推奨になりました。かわりに-describeを使用してください。

-getDDL

既存の外部表の表定義を出力します。このコマンドはリリース3.0で非推奨になりました。かわりに-describeを使用してください。

外部表の作成

Oracle SQL Connector for HDFSで提供されるExternalTableツールを使用して、外部表を自動的に作成できます。

ExternalTableツールによる外部表の作成

ExternalTableツールを使用して外部表を作成するには、使用するデータソースにあわせて次の手順を実行します。

ExternalTable -createTableコマンドの実行を完了すると、外部表を使用する準備ができます。ExternalTableは、外部表の場所ファイルも管理します。「場所ファイルの管理」を参照してください。

外部表を手動で作成するには、「SQLでの外部表の作成」の手順に従います。

-createTableのExternalTable構文

次の構文を使用して外部表を作成し、その場所ファイルを移入します。

hadoop jar OSCH_HOME/jlib/orahdfs.jar oracle.hadoop.exttab.ExternalTable \
[-conf config_file]... \
[-D property=value]... \
-createTable [--noexecute]

データ・ポンプ形式ファイルからの外部表の作成

Oracle SQL Connector for HDFSは、Oracle Loader for Hadoopで作成されるデータ・ポンプ・ファイルのみをサポートし、Oracleユーティリティで作成される汎用データ・ポンプ・ファイルはサポートしません。

Oracle SQL Connector for HDFSは、データ・ポンプ・ファイルのヘッダーのメタデータを使用してデータ・ポンプ・ファイルの外部表定義を作成します。また、preprocessorアクセス・パラメータでORACLE_LOADERアクセス・ドライバを使用します。さらに、EXTERNAL VARIABLE DATAという特殊なアクセス・パラメータも使用します。このパラメータを使用すると、ORACLE_LOADERは、Oracle Loader for Hadoopで生成されたデータ・ポンプ形式ファイルを読み取ることができます。

Oracle SQL Connector for HDFSによって作成された外部表および場所ファイルを削除するには、-dropコマンドを使用します。「Oracle SQL Connector for HDFSで作成されたデータベース・オブジェクトの削除」を参照してください。

ノート:

Oracle Loader for Hadoopで作成されるデータ・ポンプ・ファイルにコネクタがアクセスできるようにするには、Oracle SQL Connector for HDFSでOracle Database 11.2.0.2へのパッチが必要です。このパッチをダウンロードするには、http://support.oracle.comにアクセスしてOracle Bug#14557588を検索します。

リリース11.2.0.3以降では、このパッチは不要です。

必須プロパティ

次のプロパティは必須です。

このデータソースに使用されるプロパティの説明については、「Oracle SQL Connector for HDFSの構成」を参照してください。

オプションのプロパティ
データ・ポンプ形式ファイルのXMLファイルのプロパティの定義

次の例に、データ・ポンプ・ファイルを記述するプロパティを含むXMLテンプレートを示します。このテンプレートを使用するには、テキスト・ファイルにカット・アンド・ペーストし、適切な値を入力してデータ・ポンプ・ファイルを記述し、不要なオプション・プロパティを削除します。XMLテンプレートの使用方法の詳細は、「構成ファイルの作成」を参照してください。

例3-2 データ・ポンプ形式ファイルのプロパティを使用したXMLファイル

<?xml version="1.0"?>

<!-- Required Properties -->

<configuration>
  <property>
    <name>oracle.hadoop.exttab.tableName</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.defaultDirectory</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.dataPaths</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.sourceType</name>
    <value>datapump</value>
  </property>
  <property>
    <name>oracle.hadoop.connection.url</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.connection.user</name>
    <value>value</value>
  </property>

<!-- Optional Properties -->

  <property>
    <name>oracle.hadoop.exttab.logDirectory</name>
    <value>value</value>
  </property>
</configuration>

次の例では、データ・ポンプ・ファイルを読み取るSALES_DP_XTABという外部表を作成します。

例3-3 データ・ポンプ形式ファイルの外部表の定義

Oracle Databaseを実行しているオペレーティング・システム・ユーザー(通常はoracleユーザー)としてログインし、ファイル・システム・ディレクトリを作成します。Oracle RACの場合は、分散ファイル・システムにクラスタ全体のディレクトリを作成する必要があります。

$ mkdir /data/sales_dp_dir

データベース・ディレクトリを作成し、そのディレクトリに対する読取りアクセス権と書込みアクセス権を付与します。

$ sqlplus / as sysdba
SQL> CREATE OR REPLACE DIRECTORY sales_dp_dir AS '/data/sales_dp_dir'
SQL> GRANT READ, WRITE ON DIRECTORY sales_dp_dir TO scott;

外部表を作成します。

$ export OSCH_HOME="/opt/oracle/orahdfs-<version>"
$ export HADOOP_CLASSPATH="$OSCH_HOME/jlib/*:$HADOOP_CLASSPATH"
$ hadoop jar OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
-D oracle.hadoop.exttab.tableName=SALES_DP_XTAB \
-D oracle.hadoop.exttab.sourceType=datapump \
-D oracle.hadoop.exttab.dataPaths=hdfs:///user/scott/olh_sales_dpoutput/ \
-D oracle.hadoop.exttab.defaultDirectory=SALES_DP_DIR \
-D oracle.hadoop.connection.url=jdbc:oracle:thin:@//myhost:1521/myservicename \
-D oracle.hadoop.connection.user=SCOTT \
-createTable

Hive表からの外部表の作成

Oracle SQL Connector for HDFSは、Hiveメタストア・クライアントにアクセスして表の列や表データの場所に関する情報を取得することで、Hive表から外部表定義を作成します。さらに、Hive表のデータ・パスがOracle外部表の場所ファイルに公開されます。

Hive表のメタデータを読み取る場合、Oracle SQL Connector for HDFSでは、HiveのJARファイルがHADOOP_CLASSPATH変数に含まれる必要があります。Hiveクライアントが機能しているコンピュータにOracle SQL Connector for HDFSをインストールしてこれが稼働している必要があります。

Hive構成ディレクトリをHADOOP_CLASSPATH環境変数に追加したことを確認します。Hiveクライアントが正しく機能している必要があります。

Hive管理表の場合、データ・パスはウェアハウス・ディレクトリから始まります。

Hive外部表の場合、HDFSの外部の場所からのデータ・パスは、Oracle外部表の場所ファイルに公開されます。表の作成時に外部の場所が定義されるかどうかをHiveは確認しないため、Hive外部表にはデータがありません。Hive表が空の場合、1つの場所ファイルが公開されますが、ヘッダーのみが含まれデータのURIはありません。

Oracle外部表は、「動作中」のHive表ではありません。Hive表が変更された後に、ExternalTableツールを使用して、既存の外部表を削除し新しい外部表を作成する必要があります。

Oracle SQL Connector for HDFSによって作成された外部表および場所ファイルを削除するには、-dropコマンドを使用します。「Oracle SQL Connector for HDFSで作成されたデータベース・オブジェクトの削除」を参照してください。

Hive表の要件

Oracle SQL Connector for HDFSは、ROW FORMAT DELIMITED句とFILE FORMAT TEXTFILE句を使用して定義される、Hive表をサポートします。Hive管理表とHive外部表はどちらもサポートされます。

Oracle SQL Connector for HDFSはパーティション化Hive表もサポートします。この場合、Oracle SQL Connector for HDFSは1つ以上の外部表およびデータベース・ビューを作成します。「パーティション化Hive表からの外部表の作成」を参照してください。

Hive表は、バケット化される場合とされない場合があります。Hive 0.10.0のすべてのプリミティブ・タイプがサポートされています。

データ型のマッピング

次の表に、HiveとOracle間のデフォルトのデータ型マッピングを示します。Oracle外部表に作成したターゲット列のデータ型を変更するには、「オプションのプロパティ」にリストされているoracle.hadoop.exttab.hive.columnType.*プロパティを設定します。

表3-1 Hiveデータ型のマッピング

ソースのHive列のデータ型 ターゲットのOracle列のデータ型

INTBIGINTSMALLINTTINYINT

INTEGER

DECIMAL

NUMBER

DECIMAL(p,s)

NUMBER(p,s)

DOUBLE, FLOAT

NUMBER

DATE

YYYY-MM-DD書式マスクのDATE

TIMESTAMP

YYYY-MM-DD HH24:MI:SS.FF書式マスクのTIMESTAMP

BOOLEAN

VARCHAR2(5)

CHAR(size)

CHAR(size)

STRING

VARCHAR2(4000)

VARCHAR

VARCHAR2(4000)

VARCHAR(size)

VARCHAR2(size)

必須プロパティ

Hive表のソースには、次のプロパティが必要です。

このデータソースに使用されるプロパティの説明については、「Oracle SQL Connector for HDFSの構成」を参照してください。

Hive表のXMLファイルのプロパティの定義

次の例に、Hive表を記述するプロパティを含むXMLテンプレートを示します。このテンプレートを使用するには、テキスト・ファイルにカット・アンド・ペーストし、適切な値を入力してHive表を記述し、不要なオプション・プロパティを削除します。XMLテンプレートの使用方法の詳細は、「構成ファイルの作成」を参照してください。

例3-4 Hive表のプロパティを使用したXMLテンプレート

<?xml version="1.0"?>

<!-- Required Properties -->

<configuration>
  <property>
    <name>oracle.hadoop.exttab.tableName</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.defaultDirectory</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.sourceType</name>
    <value>hive</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.hive.partitionFilter</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.hive.tableName</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.hive.databaseName</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.connection.url</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.connection.user</name>
    <value>value</value>
  </property>

<!-- Optional Properties -->

  <property>
    <name>oracle.hadoop.exttab.locationFileCount</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.hive.columnType.TYPE</name>
    <value>value</value>
  </property>
</configuration>

次の例では、SALES_HIVE_XTABという外部表を作成して、Hive表からデータを読み取ります。この例では、XMLファイルではなく、コマンドラインのすべてのプロパティを定義しています。

例3-5 パーティション化されていないHive表の外部表の定義

Oracle Databaseを実行しているオペレーティング・システム・ユーザー(通常はoracleユーザー)としてログインし、ファイル・システム・ディレクトリを作成します。

$ mkdir /data/sales_hive_dir

データベース・ディレクトリを作成し、そのディレクトリに対する読取りアクセス権と書込みアクセス権を付与します。

$ sqlplus / as sysdba
SQL> CREATE OR REPLACE DIRECTORY sales_hive_dir AS '/data/sales_hive_dir'
SQL> GRANT READ, WRITE ON DIRECTORY sales_hive_dir TO scott;

外部表を作成します。

$ export OSCH_HOME="/opt/oracle/orahdfs-<version>"
$ export HADOOP_CLASSPATH="$OSCH_HOME/jlib/*:/usr/lib/hive/lib/*:/etc/hive/conf:$HADOOP_CLASSPATH"

$ hadoop jar OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
-D oracle.hadoop.exttab.tableName=SALES_HIVE_XTAB \
-D oracle.hadoop.exttab.sourceType=hive \
-D oracle.hadoop.exttab.locationFileCount=2 \
-D oracle.hadoop.exttab.hive.tableName=sales_country_us \
-D oracle.hadoop.exttab.hive.databaseName=salesdb \
-D oracle.hadoop.exttab.defaultDirectory=SALES_HIVE_DIR \
-D oracle.hadoop.connection.url=jdbc:oracle:thin:@//myhost:1521/myservicename \
-D oracle.hadoop.connection.user=SCOTT \
-createTable

ノート:

パーティション化されていないHive表およびその他のデータソースについては、プロパティoracle.hadoop.exttab.tableNameの値が外部表の名前です。

パーティション化Hive表からの外部表の作成

Oracle SQL Connector for HDFSはパーティション化Hive表をサポートしているため、単一のパーティション、パーティションの範囲またはすべてのパーティションの問合せが可能になります。Oracle Databaseでは、すべてのHiveパーティションまたはそのサブセットを表します。

関連項目:

Oracle SQL Connector for HDFSを使用したすべてのHive表へのアクセスに適用される必須プロパティ、データ型マッピングおよびその他の詳細は、「Hive表からの外部表の作成」を参照してください。

パーティション化Hive表に対するアクセスをサポートするデータベース・オブジェクト

パーティション化Hive表をサポートするために、次の表で説明するオブジェクトをOracle SQL Connector for HDFSで作成します。

表3-2 パーティション化Hive表をサポートするためのOracle Databaseの各オブジェクト

データベース・オブジェクト 説明 ネーミング規則(1)

外部表

Hiveパーティションごとに1つ

OSCHtable_name_n

例: OSCHDAILY_1およびOSCHDAILY_2

ビュー

外部表ごとに1つ。Hiveデータの問合せに使用されます。

table_name_n

例: DAILY_1およびDAILY_2

メタデータ表

Hive表に1つ。特定のHive表に関連付けられているすべての外部表およびビューを識別します。これらのデータベース・オブジェクトの作成、情報表示または削除時にこのテーブルを指定します。

table_name

例: DAILY

脚注1 テーブル名の末尾に付く"_n"は数値を示します。

たとえば、Hive表が5つのパーティションから構成される場合、Oracle SQL Connector for HDFSは5つの外部表、5つのビュー、および1つのメタデータ表をOracle Databaseに作成します。

表3-2で説明したオブジェクトおよび場所ファイルを削除するには、-dropコマンドを使用します。「Oracle SQL Connector for HDFSで作成されたデータベース・オブジェクトの削除」を参照してください。

ノート:

パーティション化Hive表およびその他のデータソースの場合は、プロパティ oracle.hadoop.exttab.tableNameの値がメタデータ表の名前です。

メタデータ表の問合せ

メタデータ表は、Hive表の問合せ方法に関する重要な情報を提供します。次の表はメタデータ表の列を説明します。

表3-3 メタデータ表の列

説明

VIEW_NAME

単一のHive表パーティションへのアクセスに使用されるOracle Databaseビュー。このビューには、Hive表列とパーティション列の両方が含まれます。

EXT_TABLE_NAME

Hive表パーティションを表すOracle外部表。外部表にはHive表列のみが含まれ、Hiveパーティション列は含まれません。

Hiveパーティション内のすべてのデータにアクセスするには、対応するOracle Databaseビューを使用します。

HIVE_TABLE_NAME

Oracle Databaseを介してアクセスされるパーティション化Hive表。

HIVE_DB_NAME

表が格納されるHiveデータベース。

HIVE­_PART_FILTER

Oracle Databaseでアクセスするためのパーティションのサブセットの選択に使用されるHiveパーティション・フィルタ。NULL値は、すべてのパーティションがアクセスされることを意味します。

パーティション列

Hive表のパーティション化に使用する各列には、メタデータ表内に別々の列があります。たとえば、メタデータ表にはHive表のCOUNTRYSTATEおよびCITYの列があり、COUNTRYSTATEおよびCITYの値の組合せでパーティション化されています。

次のSELECT文では、HIVE_SALES_DATAという名前のメタデータ表を問い合せます。

SQL> SELECT view_name, ext_table_name, Hive_table_name, \
      hive_db_name, country, city \
      FROM hive_sales_data \
      WHERE state = 'TEXAS';

問合せの結果により、Texasの各都市のデータを持つ3つのビューが特定されます。

VIEW_NAME          EXT_TABLE_NAME         HIVE_TABLE_NAME   HIVE_DB_NAME  COUNTRY  CITY 
------------------------------------------------------------------------------------------
HIVE_SALES_DATA_1  OSCHHIVE_SALES_DATA_1  hive_sales_data   db_sales      US       AUSTIN
HIVE_SALES_DATA_2  OSCHHIVE_SALES_DATA_2  hive_sales_data   db_sales      US       HOUSTON
HIVE_SALES_DATA_3  OSCHHIVE_SALES_DATA_3  hive_sales_data   db_sales      US       DALLAS

ビューには、パーティション化列の値が含まれます。外部表にはパーティション列の値が含まれないため、パーティション化Hive表に問い合せる際にはビューを使用することをお薦めします。

問合せのためのUNION ALLビューの作成

問合せを容易にするために、個々のパーティション・ビュー上にUNION ALLビューを作成できます。mkhive_unionall_view.sqlスクリプトを使用してください。このスクリプトはOSCH_HOME/example/sqlディレクトリにあります。パフォーマンスを維持するために、UNION ALLビューは50から100 (数はサイズによる)を超えるビューを作成しないでください。

mkhive_unionall_view.sqlを使用するには、次の構文を使用してください。

@mkhive_unionall_view[.sql] table schema view predicate

MKHIVE_UNIONALL_VIEWスクリプト・パラメータ

table

パーティション化Hive表を表す、Oracle Databaseにあるメタデータ表の名前。必須。

schema

メタデータ表の所有者。オプション。スキーマにデフォルト設定されています。

view

スクリプトにより作成されるUNION ALLビューの名前。オプション。table_uaにデフォルト設定されています。

predicate

UNION ALLビューに含めるHive表のパーティションを選択するのに使用されるWHERE条件。オプション。すべてのパーティションにデフォルト設定されています。

例3-6 パーティション化Hive表のUNION ALLビュー

次の例では、HIVE_SALES_DATA_UAという名前のUNION ALLビューを作成します。このビューは、HIVE_SALES_DATAメタデータ表にリストされるすべてのパーティションにアクセスします。

SQL> @mkhive_unionall_view.sql HIVE_SALES_DATA null null null
 

この例では、ALL_SALESという名前のUNION ALLビューを作成します。このビューはHIVE_SALES_DATAメタデータ表にリストされるすべてのパーティションにアクセスします。

SQL> @mkhive_unionall_view.sql HIVE_SALES_DATA null ALL_SALES null
 

次の例では、TEXAS_SALES_DATAという名前のUNION ALLビューを作成します。このビューはSTATE = 'TEXAS'のすべてのパーティションの行にアクセスします。

SQL> @mkhive_unionallview.sql HIVE_SALES_DATA null TEXAS_SALES_DATA '(STATE = ''''TEXAS'''')'
エラー・メッセージ
table name too long, max limit length

原因: データベース・オブジェクト用に生成された名前が30文字を超えています。

処置: 24文字を超えない名前をoracle.hadoop.exttab.tableNameプロパティに指定してください。Oracle SQL Connector for HDFSは、OSCHtable_name_nの規則を使用して外部表の名前を生成します。表3-2を参照してください。

table/view names containing string table_name found in schema schema_name

原因: パーティション化Hive表の外部表を作成しようとしましたが、データ・オブジェクトがすでに存在します。

処置: hadoop -dropコマンドを使用して、既存の表およびビューを削除してから-createTableコマンドを再試行してください。この解決策が失敗した場合、オブジェクトは「ダングリング」オブジェクトの可能性があります。「ダングリング・オブジェクトの削除」を参照してください。

ダングリング・オブジェクトの削除

パーティション化Hive表をサポートするためにコネクタが作成したオブジェクトを管理するには、常にOracle SQL Connector for HDFSコマンドを使用してください。メタデータ表の削除に-dropコマンドではなく、SQL drop table コマンドを使用する場合、ダングリング・オブジェクトが発生します。パーティション化Hive表の外部表およびビューを削除できない場合には、それらはダングリング・オブジェクトです。

オブジェクトを削除するときに生成されたエラー・メッセージのスキーマおよび表名を確認し、次の手順で使用してください。

ダングリング・オブジェクトを削除するには、次の手順を実行します。

  1. Oracle DatabaseでSQLセッションをオープンし、ダングリング・オブジェクトの所有者として接続します。

  2. ALL_EXTERNAL_LOCATIONSおよびALL_EXTERNAL_TABLESデータ・ディクショナリ・ビューを問い合せて外部表の場所ファイルを特定します。

    SELECT a.table_name, a.directory_name, a.location \
    FROM all_external_locations a, all_external_tables b \
    WHERE a.table_name = b.table_name AND a.table_name \
    LIKE 'OSCHtable%' AND a.owner='schema'; 
     

    前の構文のLIKE句でおよびスキーマを適切な値で置き換えます。

    出力される場所ファイルの名前にはosch-接頭辞(osch-20140408014604-175-1など)が付きます。

  3. ALL_EXTERNAL_TABLESデータ・ディクショナリ・ビューを問い合せて外部表を特定します。

    SELECT table_name FROM all_external_tables \
    WHERE table_name \
    LIKE 'OSCHtable%' AND owner=schema;
     
  4. ALL_VIEWSデータ・ディクショナリ・ビューを問い合せてデータベース・ビューを特定します。

    SELECT view_name FROM all_views 
    WHERE view_name 
    LIKE 'table%' AND owner='schema';
     
  5. 次のコマンドを使用して、表、ビューおよび場所ファイルを調査し、それらが不要であることを確認します。

    DESCRIBE schema.table;
    SELECT * FROM schema.table;
    
    DESCRIBE schema.view;
    SELECT * FROM schema.view;
    
  6. 次のようなコマンドを使用して不要な場所ファイル、表およびビューを削除します。

    EXECUTE utl_file.fremove('directory', 'location_file');
    
    DROP TABLE schema.table;
    DROP VIEW schema.view;

デリミタ付きテキスト・ファイルからの外部表の作成

Oracle SQL Connector for HDFSは、列の数、テキスト・デリミタおよびオプションで外部表の列名を指定する構成プロパティを使用して、デリミタ付きテキスト・ファイルの外部表定義を作成します。デフォルトでは、外部表のすべてのテキスト列はVARCHAR2です。列名を指定しない場合は、デフォルトでC1からCnに設定されます。nは、oracle.hadoop.exttab.columnCountプロパティで指定される列の数です。

データ型のマッピング

すべてのテキスト・データソースは、VARCHAR2(4000)に自動的にマップされます。Oracle外部表に作成したターゲット列のデータ型を変更するには、「オプションのプロパティ」にリストされているoracle.hadoop.exttab.colMap.*プロパティを設定します。

必須プロパティ

デリミタ付きテキストのソースの場合、次のプロパティが必要です。

このデータソースに使用されるプロパティの説明については、「Oracle SQL Connector for HDFSの構成」を参照してください。

デリミタ付きテキスト・ファイルのXMLファイルのプロパティの定義

この例に、デリミタ付きテキスト・ファイルを記述するすべてのプロパティを含むXMLテンプレートを示します。このテンプレートを使用するには、テキスト・ファイルにカット・アンド・ペーストし、適切な値を入力してデータ・ファイルを記述し、不要なオプション・プロパティを削除します。XMLテンプレートの使用方法の詳細は、「構成ファイルの作成」を参照してください。

例3-7 デリミタ付きテキスト・ファイルのプロパティを使用したXMLテンプレート

<?xml version="1.0"?>

<!-- Required Properties -->

<configuration>
  <property>
    <name>oracle.hadoop.exttab.tableName</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.defaultDirectory</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.dataPaths</name>
    <value>value</value>
  </property>

<!-- Use either columnCount or columnNames -->

  <property>
    <name>oracle.hadoop.exttab.columnCount</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.columnNames</name>
    <value>value</value>
  </property>

  <property>
    <name>oracle.hadoop.connection.url</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.connection.user</name>
    <value>value</value>
  </property>

<!-- Optional Properties -->

  <property>
    <name>oracle.hadoop.exttab.colMap.TYPE</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.recordDelimiter</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.fieldTerminator</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.initialFieldEncloser</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.trailingFieldEncloser</name>
    <value>value</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.locationFileCount</name>
    <value>value</value>
  </property>
</configuration>

この例では、SALES_DT_XTABという外部表をデリミタ付きテキスト・ファイルから作成します。

例3-8 デリミタ付きテキスト・ファイルの外部表の定義

Oracle Databaseを実行しているオペレーティング・システム・ユーザー(通常はoracleユーザー)としてログインし、ファイル・システム・ディレクトリを作成します。

$ mkdir /data/sales_dt_dir

データベース・ディレクトリを作成し、そのディレクトリに対する読取りアクセス権と書込みアクセス権を付与します。

$ sqlplus / as sysdba
SQL> CREATE OR REPLACE DIRECTORY sales_dt_dir AS '/data/sales_dt_dir'
SQL> GRANT READ, WRITE ON DIRECTORY sales_dt_dir TO scott;

外部表を作成します。

$ export OSCH_HOME="/opt/oracle/orahdfs-<version>"
$ export HADOOP_CLASSPATH="$OSCH_HOME/jlib/*:$HADOOP_CLASSPATH"

$ hadoop jar OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
-D oracle.hadoop.exttab.tableName=SALES_DT_XTAB \
-D oracle.hadoop.exttab.locationFileCount=2 \
-D oracle.hadoop.exttab.dataPaths="hdfs:///user/scott/olh_sales/*.dat" \
-D oracle.hadoop.exttab.columnCount=10 \
-D oracle.hadoop.exttab.defaultDirectory=SALES_DT_DIR \
-D oracle.hadoop.connection.url=jdbc:oracle:thin:@//myhost:1521/myservicename \
-D oracle.hadoop.connection.user=SCOTT \
-createTable

SQLでの外部表の作成

Oracle SQL Connector for HDFSに対する外部表を手動で作成できます。たとえば、次の手順では、ExternalTable -createTableコマンドで公開されない外部表の構文を使用できます。

追加の構文は、データ・ポンプ形式ファイルではサポートされません。

外部表を手動で作成するには、次の手順を実行します。 

  1. -createTable --noexecuteコマンドを使用して、外部表DDLを生成します。

  2. DDLに必要な変更をすべて行います。

  3. 前のステップのDDLを実行して、Oracle Databaseに表定義を作成します。

  4. ExternalTable -publishコマンドを使用して、外部表の場所ファイルにデータのURIを公開します。

外部表の更新

-publishオプションにより、テキスト、データ・ポンプまたはHiveソースに基づいた既存のOracle外部表の(HDFSデータ・パスを指し示す)場所ファイルを更新できます。

ExternalTableコマンドライン・ツールで-createTableオプションを使用して、Oracle Databaseに外部表および関連メタデータを作成します。また、外部表の場所ファイルにHDFSのデータ・ファイルのUniversal Resource Identifier (URI)を移入します。

既存の外部表の場所ファイルに更新を公開するには、ExternalTable-publishオプション付きで使用します。この操作により、外部表の場所ファイルがHDFSデータ・パスの新しいURIで更新され、ソースがパーティション化Hive表であれば、新しいパーティション用の外部表およびビューが追加されます

-publishは次の目的で使用します。

  • 既存の外部表に新しいデータを公開します。

    -createTableによって、外部表の作成時点のHDFSまたはHiveソースのスナップショットが取得されます。ただし、ソースは後で変更される可能性があります。-publishオプションにより、ソースから既存の外部表を更新できます。

  • ソースがパーティション化Hive表の場合に新しいデータを公開します。

    パーティション化Hive表であるソースに新しいパーティションが追加される場合、-publishオプションにより、新しいパーティションへのアクセスが必要な新しいデータベース・オブジェクトを追加できます。このオプションは、新しいHiveパーティションを検出し、そのパーティション用の追加の外部表およびビューを作成して、-createTableコマンドで作成されたメタデータ表を更新します。

  • -createTableコマンドを--noexecuteオプション付きで使用して手動で作成した外部表を移入します。

ノート:

publishオプションでは、現在、パーティション化Hive表が完全にサポートされます。パーティション化Hive表から導出された外部表を更新するために、回避策として-dropおよび-createTableを使用する必要はなくなりました。

公開用のExternalTable構文

hadoop jar OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
[-conf config_file]... \
[-D property=value]... \
-publish [--noexecute]

公開用のExternalTableの例

この例では、HADOOP_CLASSPATHを設定して、例3-3で作成した外部表へのHDFSデータ・パスを公開します。この環境変数の設定の詳細は、「システムへのOracle SQL Connector for HDFSの構成」を参照してください。

例3-9 データ・ポンプ形式ファイルの外部表へのHDFSデータ・パスの公開

この例ではBashシェルが使用されます。

$ export HADOOP_CLASSPATH="OSCH_HOME/jlib/*"
$ hadoop jar OSCH_HOME/jlib/orahdfs.jar oracle.hadoop.exttab.ExternalTable \
-D oracle.hadoop.exttab.tableName=SALES_DP_XTAB \
-D oracle.hadoop.exttab.sourceType=datapump \
-D oracle.hadoop.exttab.dataPaths=hdfs:/user/scott/data/ \
-D oracle.hadoop.connection.url=jdbc:oracle:thin:@//myhost:1521/myservicename \
-D oracle.hadoop.connection.user=scott -publish

この例の詳細は次のとおりです。

  • OSCH_HOMEは、Oracle SQL Connector for HDFSのインストール・ディレクトリのフル・パスです。

  • SALES_DP_XTABは、例3-3で作成した外部表です。

  • hdfs:/user/scott/data/は、HDFSデータの場所です。

  • @myhost:1521は、データベース接続文字列です。

外部表および場所ファイルの調査

-describeコマンドは、既存の外部表の定義を出力するデバッグおよび診断ユーティリティです。場所ファイルのメタデータおよび内容も見られるようになります。このコマンドを使用すると、Oracle外部表の場所ファイルの完全性を確認できます。

このコマンドを使用するには次のプロパティが必要です。

情報表示のためのExternalTable構文

hadoop jar OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
[-conf config_file]... \
[-D property=value]... \
-describe

情報表示のためのExternalTableの例

この例は、SALES_DP_XTABに関連付けられた外部表および場所ファイルの情報を表示するコマンド構文を示します。

例3-10 外部表および場所ファイルの調査

$ export HADOOP_CLASSPATH="OSCH_HOME/jlib/*"
$ hadoop jar OSCH_HOME/jlib/orahdfs.jar oracle.hadoop.exttab.ExternalTable \
-D oracle.hadoop.exttab.tableName=SALES_DP_XTAB \
-D oracle.hadoop.connection.url=jdbc:oracle:thin:@//myhost:1521/myservicename \
-D oracle.hadoop.connection.user=scott -describe

Oracle SQL Connector for HDFSで作成されたデータベース・オブジェクトの削除

-dropコマンドは、Oracle SQL Connector for HDFSによって作成されたデータベース・オブジェクトを削除します。これらのオブジェクトには外部表、場所ファイルおよびビューが含まれます。手動でオブジェクトを削除すると、「ダングリング・オブジェクトの削除」で説明している問題が発生する可能性があります。

-dropコマンドはOracle SQL Connector for HDFSが作成したオブジェクトのみを削除します。Oracle SQL Connector for HDFSで作成されたオブジェクトを削除するには、-dropコマンドを常に使用することをお薦めします。

このコマンドを使用するには次のプロパティが必要です。

削除のためのExternalTable構文

hadoop jar OSCH_HOME/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
[-conf config_file]... \
[-D property=value]... \
-drop

削除のためのExternalTableの例

この例に、SALES_DP_XTABに関連付けられたデータベース・オブジェクトを削除するコマンド構文を示します。

例3-11 データベース・オブジェクトの削除

$ export HADOOP_CLASSPATH="OSCH_HOME/jlib/*"
$ hadoop jar OSCH_HOME/jlib/orahdfs.jar oracle.hadoop.exttab.ExternalTable \
-D oracle.hadoop.exttab.tableName=SALES_DP_XTAB \
-D oracle.hadoop.connection.url=jdbc:oracle:thin:@//myhost:1521/myservicename \
-D oracle.hadoop.connection.user=scott -drop

ExternalTableツールで生成された外部表の詳細

データへのアクセスに外部表が使用されるため、外部表のすべての機能と制限が適用されます。問合せは、自動ロード・バランシングと並列で実行されます。ただし、外部表では、更新、挿入および削除操作は許可されず、索引を作成できません。外部表にアクセスすると、表の完全スキャンが常に実行されます。

Oracle SQL Connector for HDFSでは、ORACLE_LOADERアクセス・ドライバが使用されます。hdfs_streamプリプロセッサ・スクリプト(Oracle SQL Connector for HDFSに付属)は、入力データをORACLE_LOADERが処理できる形式に変更します。

構成可能な列マッピングの概要

Oracle SQL Connector for HDFSでは、デフォルトのデータ型マッピングを使用して、Hiveおよびテキスト・ソースに対して適切なデータ型の列をOracle外部表に作成します。これらのデフォルトをオーバーライドするには、すべての列または特定の列に対して様々な構成プロパティを設定します。

たとえば、テキスト・ファイルの1つのフィールドにタイムスタンプを含める場合です。デフォルトでは、このフィールドはVARCHAR2列にマップされます。ただし、TIMESTAMP列を指定して日時マスクを入力すると、値を正確にTIMESTAMPデータ型にキャストできます。TIMESTAMPデータ型では、データがテキストとして表されているときは使用できない時間ベースの問合せおよび分析がサポートされます。

デフォルトの列マッピング

テキスト・ソースはVARCHAR2列にマップされ、Hive列は、同等に最も近いOracleデータ型の列にマップされます。表3-1に、デフォルトのマッピングを示します。

すべての列のオーバーライド

次のプロパティは、外部表のすべての列に適用されます。Hiveソースの場合は、これらのプロパティ設定によって、oracle.hadoop.exttab.hive.*プロパティ設定がオーバーライドされます。

1つの列のオーバーライド

次のプロパティが適用されるのは、プロパティ名のcolumn_name部分を名前に持つ1つの列のみです。これらのプロパティ設定は、その他すべての設定をオーバーライドします。

マッピングのオーバーライドの例

次のプロパティでは、すべての列がデフォルトのVARCHAR2データ型である外部表が作成されます。

oracle.hadoop.exttab.tableName=MOVIE_FACT_EXT_TAB_TXT
oracle.hadoop.exttab.columnNames=CUST_ID,MOVIE_ID,GENRE_ID,TIME_ID,RECOMMENDED,ACTIVITY_ID,RATING,SALES

この例では、次のプロパティを設定して、複数の列のデータ型をオーバーライドします。

oracle.hadoop.exttab.colMap.TIME_ID.columnType=TIMESTAMP
oracle.hadoop.exttab.colMap.RECOMMENDED.columnType=NUMBER
oracle.hadoop.exttab.colMap.ACTIVITY_ID.columnType=NUMBER
oracle.hadoop.exttab.colMap.RATING.columnType=NUMBER
oracle.hadoop.exttab.colMap.SALES.columnType=NUMBER

Oracle SQL Connector for HDFSによって、指定したデータ型を備えた外部表が作成されます。

SQL> DESCRIBE movie_facts_ext
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
CUST_ID                                            VARCHAR2(4000)
MOVIE_ID                                           VARCHAR2(4000)
GENRE_ID                                           VARCHAR2(4000)
TIME_ID                                            TIMESTAMP(9)
RECOMMENDED                                        NUMBER
ACTIVITY_ID                                        NUMBER
RATINGS                                            NUMBER
SALES                                              NUMBER

次の例では、次のプロパティ設定を追加して、VARCHAR2列の長さを変更します。

oracle.hadoop.exttab.colMap.CUST_ID.columnLength=12
oracle.hadoop.exttab.colMap.MOVIE_ID.columnLength=12
oracle.hadoop.exttab.colMap.GENRE_ID.columnLength=12

これで、すべての列がカスタム・データ型に設定されました。

SQL> DESCRIBE movie_facts_ext
Name                                      Null?    Type
----------------------------------------- -------- ----------------------------
CUST_ID                                            VARCHAR2(12)
MOVIE_ID                                           VARCHAR2(12)
GENRE_ID                                           VARCHAR2(12)
TIME_ID                                            TIMESTAMP(9)
RECOMMENDED                                        NUMBER
ACTIVITY_ID                                        NUMBER
RATINGS                                            NUMBER
SALES                                              NUMBER

場所ファイルとは

場所ファイルは、外部表のLOCATION句で指定されるファイルです。Oracle SQL Connector for HDFSは、データ・ファイルのUniversal Resource Identifier (URI)のみを含む場所ファイルを作成します。データ・ファイルには、HDFSに格納されるデータが含まれます。

並列処理の有効化

外部表で並列処理を有効にするには、外部表のLOCATION句で複数のファイルを指定する必要があります。ファイルの数は、表の読取り時に外部表で開始される子プロセスの数を決定します。これは、並列度DOPと呼ばれます。

並列度の設定

次の手順で説明されているように、特定の並列度で実行することに決定し、場所ファイルを多数(並列度の倍数)作成できるのが理想的です。

パフォーマンスを最大にするために並列処理を設定するには、次の手順を実行します。

  1. Oracle SQL Connector for HDFSの実行時にOracle DBAで使用できる最大DOPを特定します。

    大量のデータをOracleデータベースにロードする場合は、DBAと協力してリソースを最大限に使用できる時期を特定する必要もあります。

  2. DOPの小さい倍数となる数の場所ファイルを作成します。たとえば、DOPが8の場合は、8、16、24または32個の場所ファイルを作成します。

  3. ほぼ同じサイズで、場所ファイル数の倍数となる数のHDFSファイルを作成します。たとえば、場所ファイルが32個ある場合は、データ量やHDFSファイルの最小サイズに応じて、128個や1280個以上のHDFSファイルを作成します。

  4. ALTER SESSIONコマンドを使用するか、SQL SELECT文でヒントを使用して、データ・ロードのDOPを設定します。

    この例では、ALTER SESSIONを使用してDOPを8に設定します。

    ALTER SESSION FORCE PARALLEL DML PARALLEL 8;
    ALTER SESSION FORCE PARALLEL QUERY PARALLEL 8;
    

    次の例では、PARALLELヒントを使用してDOPを8に設定します。

    INSERT /*+ parallel(my_db_table,8) */ INTO my_db_table \
       SELECT /*+ parallel(my_hdfs_external_table,8) */ * \
       FROM my_hdfs_external_table;
    

    SQL INSERT文のAPPENDヒントもパフォーマンスの向上に役立つことがあります。

場所ファイルの管理

Oracle SQL Connector for HDFSのコマンドライン・ツールExternalTableは、外部表を作成してそのHDFS URI情報を場所ファイルに公開します。外部表の場所ファイルは、oracle.hadoop.exttab.defaultDirectoryプロパティで指定されたディレクトリに格納されます。Oracle RACデータベースの場合、このディレクトリは、各データベース・サーバーからアクセス可能な分散ファイル・システムに格納する必要があります。

ExternalTableは、外部表の場所ファイルを管理しますが、これには次の操作が含まれます。

  • 名前の競合の確認後、データベース・ディレクトリに新しい場所ファイルを生成

  • データベース・ディレクトリの既存の場所ファイルを必要に応じて削除

  • データのURIを新しい場所ファイルに公開

  • 新しい場所ファイルに一致するように外部表のLOCATION句を変更

サポート対象データソースの場所ファイルの管理については、次のトピックで説明します。

データ・ポンプ・ファイル形式

データ・ポンプ・ファイルにアクセスするには、ORACLE_LOADERアクセス・ドライバが必要です。このドライバでは、各場所ファイルがHDFSの単一のデータ・ポンプ・ファイルに対応する必要があります。空の場所ファイルは許可されないため、外部表の場所ファイルの数は、HDFSのデータ・ファイルの数と厳密に一致する必要があります。

Oracle SQL Connector for HDFSは、場所ファイルの管理を自動的に引き継ぎ、外部表の場所ファイルの数とHDFSのデータ・ポンプ・ファイルの数が同じになるようにします。

HDFSのデリミタ付きファイルとHive表

ORACLE_LOADERアクセス・ドライバには、場所ファイルの数に関する制限はありません。各場所ファイルは、HDFSの1つ以上のデータ・ファイルに対応できます。外部表の場所ファイルの数は、oracle.hadoop.exttab.locationFileCount構成プロパティで示されます。

url、userおよびpasswordプロパティを使用した接続を参照してください。

場所ファイルの名前

場所ファイル名の形式は次のようになります。

osch-timestamp-number-n

この構文の詳細は次のとおりです。

  • timestampの形式はyyyyMMddhhmmssです。たとえば、2012年10月17日の10:39:41の場合、20121017103941となります。

  • numberは、異なる表の間で場所ファイル名の競合が起こらないように使用されるランダムな数字です。

  • nは、同じ表の場所ファイルで名前の競合が起こらないように使用される索引です。

たとえば、osch-20121017103941-6807-1のようになります。

Oracle SQL Connector for HDFSの構成

-Dオプションを指定したコマンドラインでExternalTableツールに構成プロパティを渡すか、構成ファイルを作成してから-confオプションを指定したコマンドラインでそのファイルを渡すことができます。これらのオプションは、実行されるコマンドの前に記述する必要があります。

たとえば、次のコマンドではexample.xmlという名前の構成ファイルを使用します。

hadoop jar OSCH_HOME/jlib/orahdfs.jar \
       oracle.hadoop.exttab.ExternalTable \
       -conf /home/oracle/example.xml \
       -createTable

「ExternalTableコマンドライン・ツールの構文」を参照してください。

構成ファイルの作成

構成ファイルは、次のような非常に単純な構造のXMLドキュメントです。

<?xml version="1.0"?>
<configuration>
  <property>
    <name>property</name>
    <value>value</value>
  </property>
     .
     .
     .
</configuration>

次の例に構成ファイルを示します。これらのプロパティの説明については、「Oracle SQL Connector for HDFS構成プロパティ・リファレンス」を参照してください。

例3-12 Oracle SQL Connector for HDFSの構成ファイル

<?xml version="1.0"?>
<configuration>
  <property>
    <name>oracle.hadoop.exttab.tableName</name>
    <value>SH.SALES_EXT_DIR</value>
  </property>
  <property>
    <name>oracle.hadoop.exttab.dataPaths</name>
    <value>/data/s1/*.csv,/data/s2/*.csv</value>
  </property>
  <property>
    <name>oracle.hadoop.connection.url</name>
    <value>jdbc:oracle:thin:@//myhost:1521/myservicename</value>
  </property>
  <property>
    <name>oracle.hadoop.connection.user</name>
    <value>SH</value>
  </property>
</configuration>

Oracle SQL Connector for HDFS構成プロパティ・リファレンス

次に、ExternalTableコマンドライン・ツールで使用される構成プロパティの一覧を示します。プロパティは次のカテゴリに編成されます。

一般的なプロパティ

プロパティ 説明

oracle.hadoop.exttab.badFileFormatUsePercentA

外部表の不正ファイル名に'%a'を含むかどうかを示します。これは、-createTableコマンドのオプションのプロパティです。

有効な値: TRUEFALSE

デフォルト値: FALSE

デフォルトの不正ファイル名は<external_table_name>_%p.badです。値がTRUEの場合、これは<external_table_name>_%a.badという形式の決定性の不正ファイル名を生成します。例: 'mytable_000.bad'および'mytable_001.bad'。

.badファイルが存在する場合は、.badファイルに関する診断外部表を作成し、拒否された行を確認できます。拒否された行がない場合、.badファイルは生成されません。

関連項目:

oracle.hadoop.exttab.colMap.columnLength

外部表のCHARVARCHAR2NCHARNVARCHAR2およびRAW型の列すべての長さを指定します。オプション。

デフォルト値: 列タイプで許容される最大長

Oracle Database 12cの場合、Oracle SQL Connector for HDFSでは、データベースのMAX_STRING_SIZEオプションの設定がSTANDARDEXTENDEDかに基づいて、VARCHAR2NVARCHAR2およびRAW列の長さを設定します。

有効な値: 整数

oracle.hadoop.exttab.colMap.columnType

Hiveおよびテキスト・ソースのすべての列のデータ型マッピングを指定します。オプション。

oracle.hadoop.exttab.colMap.column_name.columnTypeを設定することにより、特定の列に対するこの設定をオーバーライドできます。

デフォルト値: テキストの場合はVARCHAR2です。Hiveについては、表3-1を参照してください。

有効な値: 次のOracleデータ型がサポートされています。

  • VARCHAR2
  • NVARCHAR2
  • CHAR
  • NCHAR
  • CLOB
  • NCLOB
  • NUMBER
  • INTEGER
  • FLOAT
  • BINARY_DOUBLE
  • BINARY_FLOAT
  • RAW*
  • DATE
  • TIMESTAMP
  • TIMESTAMP WITH TIME ZONE
  • TIMESTAMP WITH LOCAL TIME ZONE
  • INTERVAL DAY TO SECOND
  • INTERVAL YEAR TO MONTH
  • * デリミタ付きテキスト・ファイルのRAWバイナリ・データは16進でエンコードされる必要があります。

oracle.hadoop.exttab.colMap.dateMask

すべてのDATE列に対して、外部表のdate_format_spec句で使用される書式マスクを指定します。この句は、文字データ・フィールドに特定書式の日付が含まれていることを示します。

デフォルト値: NLS_DATE_FORMATデータベース・パラメータで設定されているデフォルトのグローバリゼーション書式マスク

有効な値: 『Oracle Database SQL言語リファレンス』で説明されている日時書式モデル。ただし、引用符を含めることはできません。

oracle.hadoop.exttab.colMap.fieldLength

すべてのCLOB列に対して、ORACLE_LOADERアクセス・ドライバで使用されている文字バッファの長さを設定します。この値は、データ・ファイルのフィールドとそのデータ型を識別するために、外部表定義のfield_list句で使用されます。

デフォルト値: 4000バイト

有効な値: 整数

oracle.hadoop.exttab.colMap.timestampMask

すべてのTIMESTAMP列およびTIMESTAMP WITH LOCAL TIME ZONE列に対して、外部表のdate_format_spec句で使用される書式マスクを指定します。この句は、文字データ・フィールドに特定書式のタイムスタンプが含まれていることを示します。

デフォルト値: NLS_TIMESTAMP_FORMATデータベース・パラメータで設定されているデフォルトのグローバリゼーション書式マスク

有効な値: 『Oracle Database SQL言語リファレンス』で説明されている日時書式モデル。ただし、引用符を含めることはできません。

oracle.hadoop.exttab.colMap.timestampTZMask

すべてのTIMESTAMP WITH TIME ZONE列に対して、外部表のdate_format_spec句で使用される書式マスクを指定します。この句は、文字データ・フィールドに特定書式のタイムスタンプが含まれていることを示します。

デフォルト値: NLS_TIMESTAMP_TZ_FORMATデータベース・パラメータで設定されているデフォルトのグローバリゼーション書式マスク

有効な値: 『Oracle Database SQL言語リファレンス』で説明されている日時書式モデル。ただし、引用符を含めることはできません。

oracle.hadoop.exttab.colMap.column_name.columnLength

外部表のCHARVARCHAR2NCHARNVARCHAR2およびRAW型の列すべての長さを指定します。オプション。

デフォルト値: oracle.hadoop.exttab.colMap.columnLengthの値。このプロパティが設定されていない場合は、データ型で許容される最大長

有効な値: 整数

oracle.hadoop.exttab.colMap.column_name.columnType

column_nameに対するデータ型マッピングをオーバーライドします。オプション。

column_nameは、大文字と小文字を区別します。Hive表の列またはoracle.hadoop.exttab.columnNamesにリストされている列の名前と正確に一致する必要があります。

デフォルト値: oracle.hadoop.exttab.colMap.columnTypeの値。このプロパティが設定されていない場合は、表3-1で特定されるデフォルトのデータ型

有効な値: 「oracle.hadoop.exttab.colMap.columnType」を参照してください。

oracle.hadoop.exttab.colMap.column_name.dateMask

column_nameに対する書式マスクをオーバーライドします。オプション。

column_nameは、大文字と小文字を区別します。Hive表の列またはoracle.hadoop.exttab.columnNamesにリストされている列の名前と正確に一致する必要があります。

デフォルト値: oracle.hadoop.exttab.colMap.dateMaskの値。

有効な値: 『Oracle Database SQL言語リファレンス』で説明されている日時書式モデル。ただし、引用符を含めることはできません。

oracle.hadoop.exttab.colMap.column_name.fieldLength

column_nameに対して、ORACLE_LOADERアクセス・ドライバで使用されている文字バッファの長さをオーバーライドします。このプロパティは、特にCLOB列および拡張データ型列で有用です。オプション。

column_nameは、大文字と小文字を区別します。Hive表の列またはoracle.hadoop.exttab.columnNamesにリストされている列の名前と正確に一致する必要があります。

デフォルト値: Oracle SQL Connector for HDFSでは、次の表に示すようにデフォルトのフィールドの長さを設定します。

表3-4 フィールドの長さの計算

ターゲット列のデータ型 フィールドの長さ

VARCHAR2NVARCHAR2CHARNCHAR

oracle.hadoop.exttab.colMap.column_name.columnLengthの値

RAW

2 * columnLengthプロパティ

CLOBNCLOB

oracle.hadoop.exttab.colMap.fieldLengthの値

その他のすべての型

255 (外部表のデフォルトのサイズ)

有効な値: 整数

oracle.hadoop.exttab.colMap.column_name.nullIfSpecifier

このプロパティは、外部表のcolumn_nameによって識別される列に適用されます。オプション。oracle.hadoop.exttab.nullIfSpecifierプロパティをオーバーライドします。

型: string

有効な値: oracle.hadoop.exttab.nullIfSpecifierプロパティと同じです。

デフォルト値: なし。

このプロパティは、デリミタ付きテキストのソースにのみ適用されます。

oracle.hadoop.exttab.colMap.column_name.timestampMask

column_nameに対する書式マスクをオーバーライドします。オプション。

column_nameは、大文字と小文字を区別します。Hive表の列またはoracle.hadoop.exttab.columnNamesにリストされている列の名前と正確に一致する必要があります。

デフォルト値: oracle.hadoop.exttab.colMap.timestampMaskの値。

有効な値: 『Oracle Database SQL言語リファレンス』で説明されている日時書式モデル。ただし、引用符を含めることはできません。

oracle.hadoop.exttab.colMap.column_name.timestampTZMask

column_nameに対する書式マスクをオーバーライドします。オプション。

column_nameは、大文字と小文字を区別します。Hive表の列またはoracle.hadoop.exttab.columnNamesにリストされている列の名前と正確に一致する必要があります。

デフォルト値: oracle.hadoop.exttab.colMap.timestampTZMaskの値。

有効な値: 『Oracle Database SQL言語リファレンス』で説明されている日時書式モデル。ただし、引用符を含めることはできません。

oracle.hadoop.exttab.columnCount

デリミタ付きテキスト・ファイルから作成される外部表の列の数を指定します。列名はC1、C2、... Cnのように設定されます。nはこのプロパティの値です。

このプロパティは、oracle.hadoop.exttab.columnNamesが設定される場合は無視されます。

oracle.hadoop.exttab.sourceType=textの場合は、-createTableコマンドでこのプロパティを使用します。

デリミタ付きテキスト・ファイルから外部表を作成する場合は、このプロパティまたはoracle.hadoop.exttab.columnNamesを設定する必要があります。

oracle.hadoop.exttab.columnNames

デリミタ付きテキスト・ファイルから作成される外部表の列名のカンマ区切りリストを指定します。このプロパティを設定しない場合、列名はC1、C2、... Cnのようになります。noracle.hadoop.exttab.columnCountプロパティの値です。

列名はSQL識別子として読み取られます。引用符で囲まれていない値は大文字に変換され、二重引用符で囲まれている値は入力したとおりに使用されます。

oracle.hadoop.exttab.sourceType=textの場合、-createTableコマンドでこのプロパティを使用します。

デリミタ付きテキスト・ファイルから外部表を作成する場合は、このプロパティまたはoracle.hadoop.exttab.columnCountを設定する必要があります。

oracle.hadoop.exttab.dataCompressionCodec

注意:

このプロパティは非推奨です。

OSCHは、実行時に各ファイルの圧縮コードを検出します。データセットには、圧縮ファイルと非圧縮ファイルの両方を含めることも、異なるコーデックで圧縮されたファイルを含めることもできます。

データ・ファイルの圧縮に使用される圧縮コーデック・クラスの名前を指定します。このプロパティは、データ・ファイルを圧縮する場合に指定します。オプション。

このプロパティは、org.apache.hadoop.io.compress.CompressionCodecインタフェースを実装する圧縮コーデックのクラス名を指定します。このコーデックはすべてのデータ・ファイルに適用されます。

Hadoopでは、次を含む複数の標準コーデックを使用できます。

  • bzip2: org.apache.hadoop.io.compress.BZip2Codec

  • gzip: org.apache.hadoop.io.compress.GzipCodec

デフォルト値: なし

oracle.hadoop.exttab.dataPaths

完全修飾されたHDFSパスのカンマ区切りリストを指定します。このプロパティを使用すると、パスの指定に特別なパターン一致文字を使用して、入力を制限できます。次の表を参照してください。-createTableおよび-publishコマンドでデータ・ポンプ・ファイルまたはデリミタ付きテキスト・ファイルを使用する場合、このプロパティは必須です。Hiveデータソースの場合、このプロパティは無視されます。

たとえば、/data/s2/内のすべてのファイルと、/data/s7//data/s8/および/data/s9/内のCSVファイルのみを選択するには、次の式を入力します。

/data/s2/,/data/s[7-9]/*.csv

外部表は、リストされたすべてのファイルおよびリストされたディレクトリ内のすべてのファイルに含まれるデータにアクセスします。これらのファイルで1つのデータセットを構成します。

データセットには、圧縮ファイルを含めることも、非圧縮ファイルを含めることもできますが、両方を含めることはできません。

表3-5 パターン一致文字

文字 説明

?

任意の1文字に一致します。

*

0文字以上の文字に一致します。

[abc]

文字セット{a, b, c}内の1文字に一致します。

[a-b]

文字の範囲{a...b}内の1文字に一致します。文字aは、b以下である必要があります。

[^a]

文字セットまたは範囲{a}外の1文字に一致します。カレット(^)は、左カッコの直後に付ける必要があります。

\c

文字cの特別な意味を無効にします。バックスラッシュ(\)は、エスケープ文字です。

{ab\,cd}

文字列セット{ab, cd}内の文字列に一致します。カンマの前にエスケープ文字(\)を付けて、パス区切りとしてのカンマの意味を無効にします。

{ab\,c{de\,fh}}

文字列セット{ab, cde, cfh}内の文字列に一致します。カンマの前にエスケープ文字(\)を付けて、パス区切りとしてのカンマの意味を無効にします。

oracle.hadoop.exttab.dataPathFilter

パス・フィルタ・クラスを指定します。Hiveデータソースの場合、このプロパティは無視されます。

Oracle SQL Connector for HDFSは、デフォルトのフィルタを使用して、先頭がドットまたはアンダースコアの隠しファイルを除外します。このプロパティを使用して別のパス・フィルタ・クラスを指定する場合、デフォルトのフィルタの他にも使用するフィルタが機能します。そのため、使用するフィルタで受け入れられる表示ファイルのみが考慮されます。

oracle.hadoop.exttab.defaultDirectory

Oracle外部表のデフォルトのディレクトリを指定します。このディレクトリは、ディレクトリ・オブジェクトを明示的に指定しない入力ファイルおよび出力ファイルのすべてに使用されます。Oracle RACでは、このディレクトリは、すべてのOracleインスタンスがアクセスできる共有ディレクトリである必要があります。

有効な値: 既存のデータベース・ディレクトリの名前

引用符で囲まれていない名前は大文字に変更されます。二重引用符で囲まれている名前は変更されないため、大文字と小文字を区別する場合は、二重引用符で囲まれた名前を使用します。一重引用符で囲まれている名前は、デフォルトのディレクトリ名に使用できません。

-createTableコマンドではこのプロパティが必要です。

oracle.hadoop.exttab.fieldTerminator

oracle.hadoop.exttab.sourceType=textの場合、外部表のフィールドの終端文字を指定します。オプション。

デフォルト値: , (カンマ)

有効な値: 次のいずれかの形式の文字列

  • 1つ以上の標準印刷可能文字(\uによる開始は不可)。たとえば、\tはタブを表します。

  • \uHHHH形式の1つ以上のエンコード文字。HHHHは、UTF-16の文字をビッグ・エンディアンの16進で表したものです。たとえば、\u0009はタブを表します。16進数の桁は大文字と小文字を区別しません。

2つの形式を組み合せないでください。

oracle.hadoop.exttab.hive.columnType.*

Hiveデータ型をOracleデータ型にマップします。このプロパティ名はHiveデータ型を識別し、その値はOracleデータ型です。外部表のターゲット列は、このプロパティで示されたOracleデータ型で作成されます。

HiveのTIMESTAMP列がOracleのTIMESTAMP列にマップされている場合、書式マスクはYYYY-MM-DD H24:MI:SS.FFですHiveのSTRING列がOracleのTIMESTAMP列にマップされている場合、データベースのNLSパラメータ設定がデフォルトで使用されます。これらのデフォルトをオーバーライドするには、oracle.hadoop.exttab.colMap.timestampMaskまたはoracle.hadoop.exttab.colMap.timestampTZMaskプロパティを使用します。

デフォルト値: 次の表に、Hive列タイプのプロパティとそのデフォルト値を示します。

有効な値: oracle.hadoop.exttab.colMap.columnTypeに対する有効な値を参照してください。

表3-6 Hive列タイプのマッピングのプロパティ

プロパティ デフォルト値

oracle.hadoop.exttab.hive.columnType.BIGINT

INTEGER

oracle.hadoop.exttab.hive.columnType.BOOLEAN

VARCHAR2

oracle.hadoop.exttab.hive.columnType.DECIMAL

NUMBER

oracle.hadoop.exttab.hive.columnType.DOUBLE

NUMBER

oracle.hadoop.exttab.hive.columnType.FLOAT

NUMBER

oracle.hadoop.exttab.hive.columnType.INT

INTEGER

oracle.hadoop.exttab.hive.columnType.SMALLINT

INTEGER

oracle.hadoop.exttab.hive.columnType.STRING

VARCHAR2

oracle.hadoop.exttab.hive.columnType.TIMESTAMP

TIMESTAMP

oracle.hadoop.exttab.hive.columnType.TINYINT

INTEGER

oracle.hadoop.exttab.hive.databaseName

入力データ表を含むHiveデータベースの名前を指定します。

oracle.hadoop.exttab.sourceType=hiveの場合、-createTableコマンドでこのプロパティが必要です。

oracle.hadoop.exttab.hive.partitionFilter

ソースHive表パーティションのフィルタに使用する有効なHiveQL式を指定します。表がパーティション化されていない場合、このプロパティは無視されます。

型: String

デフォルト値: なし。Hive表のすべてのパーティションは外部表にマップされます。

有効な値: 有効なHiveQL式。

説明: ソースHive表パーティションのフィルタに使用する有効なHiveQL式を指定します。Hive表がパーティション化されていない場合、このプロパティは無視されます。他の列を含めてもエラーは発生しませんが、意図しない結果となる可能性があります。他の列は含めないことをお薦めします。

式は次の制限に従う必要があります。

  • パーティション内にある個々のレコードではなく、パーティションを選択します。

  • 意図しない結果をもたらす可能性があるため、表をパーティション化するのに使用されない列は含めません。

  • 副問合せは含めません。

  • ユーザー定義関数(UDF)は含めません。組込み関数はサポートされます。

  • Hive変数ネームスペース(env:system:hiveconf:およびhivevar:など)はサポートされません。OSCHがこの文字列を処理するとき、Hive変数の拡張は無効になっているためです。Hive CLIですべての変数を拡張してからこのプロパティを設定します。次に例を示します。

    CREATE VIEW view_name AS SELECT * from database.table_name WHERE expression;
    DESCRIBE FORMATTED view_name;

    「View Original Text」フィールドには、すべての変数が拡張された問合せが含まれます。whereから始まるwhere句をコピーします。

    すべての変数拡張はHadoopレベルで解決されるため、式で使用されるすべてのHadoop変数を汎用オプション(-Dおよび-conf)を使用して定義します。Hive CLIを使用して式をテストし、所定の結果が返されることを確認します。次の例では、このコマンドでソース表が定義されていることを前提としています。

CREATE TABLE t(c string)
   PARTITIONED BY (p1 string, p2 int, p3 boolean, p4 string, p5 timestamp);

例1: ネストされた式

p1 like 'abc%' or (p5 >= '2010-06-20' and p5 <= '2010-07-03')

例2: 組込み関数

year(p5) = 2014

例3: 悪い使用例: 表のパーティション化に使用されていない列

この例では、cを使用することで、表のパーティション化に使用されていない列は不要で、予期しない結果を引き起こす可能性があることを示します。

次の例はp2 > 35と同じ結果になります。

p2 > 35 and c like 'abc%'

次の例は、すべてのパーティションをロードします。すべてのパーティションはc like 'abc%を含む可能性があるため、パーティションはフィルタで除外されます。

p2 > 35 or c like 'abc%'

oracle.hadoop.exttab.hive.refreshTables

ソースがHiveパーティション化表の場合にのみ適用され、それ以外では無視されます。このプロパティは、ソースで新しいHiveパーティションの新しい外部表およびビューを追加する場合に、-publish操作で既存の外部表のHDFSデータ・パスをリフレッシュするかどうかを指定します。

リフレッシュを有効にするには、このプロパティをTRUEに設定します。このリフレッシュを有効にすると、-publish操作が遅くなる可能性があることに注意してください。ソース表の既存のHiveパーティションが変更されていない場合、このプロパティをFALSEに設定します。

デフォルト値: FALSE

oracle.hadoop.exttab.hive.tableName

既存のHive表の名前を指定します。

oracle.hadoop.exttab.sourceType=hiveの場合、-createTableコマンドでこのプロパティが必要です。

oracle.hadoop.exttab.hive.deleteObsoleteTables

-publish操作で、パーティション化Hive表のどのパーティションにもマップされないビューおよび外部表を削除するかどうかを指定します。このプロパティは、ソースがHiveパーティション化表の場合にのみ適用され、それ以外では無視されます。このプロパティは、Hiveパーティション化ソース表に対する元の-createTable操作にoracle.hadoop.exttab.hive.partitionFilterプロパティが含まれる場合も無視されます

古いオブジェクトの削除を有効にするには、このプロパティをTRUEに設定します。

デフォルト値: FALSE

oracle.hadoop.exttab.initialFieldEncloser

デリミタ付きテキスト・ファイルから作成される外部表の開始フィールド囲み文字を指定します。オプション。

デフォルト値: null。外部表定義に囲み文字は指定されません。

oracle.hadoop.exttab.sourceType=textの場合、-createTableコマンドでこのプロパティを使用します。

有効な値: 次のいずれかの形式の文字列

  • 1つ以上の標準印刷可能文字(\uによる開始は不可)。

  • \uHHHH形式の1つ以上のエンコード文字。HHHHは、UTF-16の文字をビッグ・エンディアンの16進で表したものです。16進数の桁は大文字と小文字を区別しません。

2つの形式を組み合せないでください。

oracle.hadoop.exttab.locationFileCount

外部表の場所ファイルの目的の数を指定します。データ・ポンプ・ファイル以外のファイルにのみ適用可能です。

デフォルト値: 4

データ・ファイルがデータ・ポンプ形式の場合、このプロパティは無視されます。それ以外は、場所ファイルの数は次のいずれか少ない方になります。

  • データ・ファイルの数

  • このプロパティの値

少なくとも1つの場所ファイルが作成されます。

場所ファイルの数の詳細は、「並列処理の有効化」を参照してください。

oracle.hadoop.exttab.logDirectory

ログ・ファイルと不正なファイルが格納されるデータベース・ディレクトリを指定します。ファイル名は、外部表で使用されるデフォルトの値になります。たとえば、ログ・ファイルの名前は、表名の後に_%p.logが続きます。

これは、-createTableコマンドのオプションのプロパティです。

ファイル名のデフォルトの拡張子を次に示します。

  • ログ・ファイル: log

  • 不正なファイル: bad

有効な値: 既存のOracleディレクトリ・オブジェクト名。

引用符で囲まれていない名前は大文字に変更されます。引用符で囲まれている名前は変更されません。次の表に、値が変換される場合の例を示します。

例3-7 引用符で囲まれている値と引用符で囲まれていない値の例

指定される値 解釈される値

my_log_dir:'sales_tab_%p.log'

MY_LOG_DIR/sales_tab_%p.log

'my_log_dir':'sales_tab_%p.log'

my_log_dir/sales_tab_%p.log

"my_log_dir":"sales_tab_%p.log"

my_log_dir/sales_tab_%p.log

oracle.hadoop.exttab.nullIfSpecifier

外部表定義のNULLIF句を指定します。オプション。

このプロパティは、外部表のすべての列に適用されます。

型: string

有効な値: 次の形式の文字列。

  • 1つ以上の標準印刷可能文字(例: \N)

  • \uHHHH形式の1つ以上のエンコード文字。HHHHは、UTF-16の文字をビッグ・エンディアンの16進で表したものです。例: \u000Aは改行を表します。16進数の桁は大文字と小文字を区別しません。

デフォルト値: なし。

このプロパティは、デリミタ付きテキストのソースにのみ適用されます。

関連項目:

例3-1。この例は、Oracle DatabaseからHDFSデータ・ファイルにアクセスする場合のnullIfSpecifierの使用方法を示しています。

oracle.hadoop.exttab.preprocessorDirectory

プリプロセッサのデータベース・ディレクトリを指定します。ファイル・システム・ディレクトリには、hdfs_streamスクリプトが含まれる必要があります。

デフォルト値: OSCH_BIN_PATH

プリプロセッサのディレクトリは、外部表のPREPROCESSOR句で使用されます。

oracle.hadoop.exttab.preprocessorScript

外部表のプリプロセッサ・スクリプトの名前を指定します。

デフォルト値: hdfs_stream

プリプロセッサ・スクリプト名は、外部表のPREPROCESSOR句で使用されます。このプロパティが必須なのはMicrosoft Windowsプラットフォームで稼働しているOracle Databaseに限られ、その他すべてのOracle Databaseプラットフォームではオプションです。Microsoft Windowsでは、値はhdfs_stream.cmdに設定する必要があります。

oracle.hadoop.exttab.recordDelimiter

デリミタ付きテキスト・ファイルから作成される外部表のレコード・デリミタを指定します。オプション。

デフォルト値: \n

oracle.hadoop.exttab.sourceType=textの場合は、-createTableコマンドでこのプロパティを使用します。

有効な値: 次のいずれかの形式の文字列

  • 1つ以上の規則正しい出力可能文字(\uによる開始は不可)。

  • \uHHHH形式の1つ以上のエンコード文字。HHHHは、UTF-16の文字をビッグ・エンディアンの16進で表したものです。16進数の桁は大文字と小文字を区別しません。

2つの形式を組み合せないでください。

oracle.hadoop.exttab.sourceType

ソース・ファイルのタイプを指定します。-createTable操作と-publish操作の場合、このプロパティの値が必要です。

デフォルト値: text

有効な値: datapumphiveまたはtext

oracle.hadoop.exttab.stringSizes

文字列に指定される長さがバイトか文字かを示します。この値は、外部表のSTRING SIZES ARE IN句で使用されます。マルチバイト文字セットのロード時は、文字を使用します。『Oracle Databaseユーティリティ』を参照してください。

デフォルト値: BYTES

有効な値: BYTESまたはCHARACTERS

oracle.hadoop.exttab.createLogFiles

外部表の問合せ時にログ・ファイルを作成するかどうかを指定します。開発中はログ・ファイル作成を有効にし、本番中には最高のパフォーマンスを得るためにログ・ファイル作成を無効にすることをお薦めします。

デフォルト値: TRUE

デフォルトではログ・ファイルが作成されます。ログ・ファイルの作成を停止するには、表を削除し、このプロパティをFALSEに設定してから表を再作成する必要があります。表を削除および再作成するには、-dropおよび-createTableコマンドを使用します。

oracle.hadoop.exttab.printVerbose

-publishの操作中にコンソールに詳細レポートを出力するかどうかを指定します。コンソールに詳細レポートを表示するには、この値をTRUEに設定します。このプロパティは、デバッグ専用です。

デフォルト値: FALSE

oracle.hadoop.exttab.createBadFiles

外部表の問合せ時に不正なファイルを作成するかどうかを指定します。不正なファイルには、不正なデータのある行に関する情報が含まれます。不正なファイルは、不正なデータがある場合にのみ作成されます。不正なファイルを作成することをお薦めします。

デフォルト値: TRUE

デフォルトでは不正なファイルが作成されます。不正なファイルの作成を停止するには、表を削除し、このプロパティをFALSEに設定してから表を再作成する必要があります。表を削除および再作成するには、-dropおよび-createTableコマンドを使用します。

このプロパティは、Hiveおよびデリミタ付きテキストのソースにのみ適用されます。

oracle.hadoop.exttab.logFileFormatUsePercentA

外部表のログ・ファイル名に'%a'を含むかどうかを示します。これは、-createTableコマンドのオプションのプロパティです。

有効な値: TRUEFALSE

デフォルト値: FALSE

デフォルトのログ・ファイル名は<external_table_name>_%p.logです。値がTRUEの場合、これは<external_table_name>_%a.logという形式の決定性のログ・ファイル名を生成します。例: 'mytable_000.log'および'mytable_001.log'。

ロードが正常に行われたかどうかを判断するため、または拒否された行の理由を確認するために、.logファイルに関する診断外部表を作成できます。

関連項目:

oracle.hadoop.exttab.tableName

パーティション化Hive表のメタデータ表、またはその他すべてのデータソースに関する外部表のスキーマで修飾された名前を、次の形式で指定します。

schemaName.tableName

schemaNameを省略すると、スキーマ名はデフォルトで接続ユーザー名に設定されます。

デフォルト値: なし

すべての操作で必須のプロパティ。

oracle.hadoop.exttab.trailingFieldEncloser

デリミタ付きテキスト・ファイルから作成される外部表の終了フィールド囲み文字を指定します。オプション。

デフォルト値: null。デフォルトでoracle.hadoop.exttab.initialFieldEncloserの値に設定されます。

oracle.hadoop.exttab.sourceType=textの場合は、-createTableコマンドでこのプロパティを使用します。

有効な値: 次のいずれかの形式の文字列

  • 1つ以上の規則正しい出力可能文字(\uによる開始は不可)。

  • \uHHHH形式の1つ以上のエンコード文字。HHHHは、UTF-16の文字をビッグ・エンディアンの16進で表したものです。16進数の桁は大文字と小文字を区別しません。

2つの形式を組み合せないでください。

url、userおよびpasswordプロパティを使用した接続

url、userおよびpasswordプロパティは、異なる接続メソッドを提供します。これらのプロパティは、Oracle Walletを使用した接続に必要なプロパティと併用しないでください。

プロパティ 説明

oracle.hadoop.connection.url

次のようなThinスタイル・サービス名形式のデータベース接続文字列を指定します。

jdbc:oracle:thin:@//host_name:port/service_name

サービス名が不明な場合は、特権ユーザーとして次のSQLコマンドを入力します。

SQL> show parameter service

このプロパティは、他のすべての接続プロパティより優先されます。

デフォルト値: 定義されていません。

有効な値: 1つの文字列

oracle.hadoop.connection.user

Oracleデータベースのログイン名を指定します。oracle.hadoop.connection.passwordが指定されていない場合は、externalTableツールによってパスワードを求められます。

デフォルト値: 定義されていません。

有効な値: 1つの文字列

oracle.hadoop.connection.password

Oracle Databaseユーザーのパスワード。重要でないテスト環境やデモ環境以外で、このプロパティをクリア・テキスト・パスワードを格納するために使用しないことをお薦めします。接続からpasswordプロパティを除外することで、パスワード・プロンプト/応答を強制できます。この場合、externalTableツールによってパスワードの入力が求められます。プロンプト/応答なしの接続が必要な場合は、次の項で説明するOracle Wallet接続メソッドをかわりに使用してください。

デフォルト値: 定義されていません。

有効な値: 1つの文字列

Oracle Walletを使用した接続

Oracle Walletを外部パスワード・ストアとして使用する場合、次の表に示すプロパティを設定します。

表3-8 Oracle Walletを使用した接続に必要なプロパティ

プロパティ 説明

oracle.hadoop.connection.tnsEntryName

tnsnames.oraファイルに定義されたTNSエントリ名を指定します。

このプロパティは、oracle.hadoop.connection.tns_adminプロパティとともに使用されます。

デフォルト値: 定義されていません。

有効な値: 1つの文字列

oracle.hadoop.connection.tns_admin

tnsnames.oraファイルを格納するディレクトリを指定します。データベース接続文字列でTransparent Network Substrate (TNS)のエントリ名を使用するようにこのプロパティを定義します。TNSNamesをJDBC Thinドライバとともに使用する場合は、このプロパティまたはJavaのoracle.net.tns_adminプロパティを設定する必要があります。両方のプロパティを設定した場合、このプロパティがoracle.net.tns_adminより優先されます。

Oracle Walletを外部パスワード・ストアとして使用する場合、このプロパティを設定する必要があります。

デフォルト値: Java oracle.net.tns_adminシステム・プロパティの値

有効な値: 1つの文字列

oracle.hadoop.connection.wallet_location

接続の資格証明が格納されるOracle Walletディレクトリへのファイル・パスを指定します。

デフォルト値: 定義されていません。

有効な値: 1つの文字列

ヒント:

Oracle Walletを使用した接続は多くのTNSエントリに対応できるため、user、passwordおよびurlプロパティを使用する接続よりも推奨されます。後者は単一のマシン/ポート/サービス名の組合せに制限されます。

簡単かつ段階的なデモについては、Connecting Hadoop With Oracleブログの投稿Using Oracle SQL Connector for HDFS with Oracle Walletを参照してください。

HDFS内のデータの問合せのパフォーマンスに関するヒント

大量のデータを処理する場合、並列処理はきわめて重要です。外部表を使用する場合、必ず次のSQLコマンドを使用して並列問合せを有効にします。

ALTER SESSION ENABLE PARALLEL QUERY;

Oracle SQL Connector for HDFSによって作成された外部ファイルからOracle Databaseにデータをロードする前に、並列DDLを有効にします。

ALTER SESSION ENABLE PARALLEL DDL;

既存のデータベース表にデータを挿入する前に、次のSQLコマンドを使用して並列DMLを有効にします。

ALTER SESSION ENABLE PARALLEL DML;

APPENDPQ_DISTRIBUTEなどのヒントにより、データ挿入時のパフォーマンスも向上します。

パフォーマンス改善に関する詳細および例は、My Oracle Supportドキュメント2111850.1を参照してください。