Oracle Databaseアダプタは、データをOracle Databaseの表にロードするためのカスタム関数を提供します。
このアダプタでサポートされているカスタムput関数は、実行時にOracle Loader for Hadoopを自動的に呼び出し、データをただちにロードするか、またはデータをHDFSに出力します。Oracle Databaseアダプタの複数のカスタムput関数を1つの問合せ内で宣言して使用できます。たとえば、1つの問合せを使用して、データを異なる表または異なるOracleデータベースにロードできます。
Oracle Loader for Hadoopがシステムにインストールされていること、およびOLH_HOME
環境変数がインストール・ディレクトリに設定されていることを確認してください。「Oracle XQuery for Hadoopのインストール」のステップ2を参照してください。必須ではありませんが、このアダプタを使用する前に、Oracle Loader for Hadoopをよく理解しておくと役立ちます。
次のトピックでは、Oracle Databaseアダプタについて説明します。
別のユーティリティ(SQL*Loaderなど)を使用した後続のロード用に、次の注釈を使用して、直接またはバイナリ・ファイルやテキスト・ファイルを生成してOracleデータベースの表に書き込む関数を定義できます。
シグネチャ
Oracleデータベース表に書き込むカスタム関数には、次のシグネチャが必要です。
declare %oracle:put(["jdbc" | "oci" | "text" | "datapump"]) [%oracle:columns(col1 [, col2...])] [%oracle-property annotations] function local:myPut($column1 [as xs:allowed_type_name[?]], [$column2 [as xs:allowed_type_name[?]], ...]) external;
put関数および出力モードを宣言します。必須。
オプションのoutput_modeパラメータは、次のいずれかの文字列リテラル値です。
jdbc
: JDBC接続を使用して、Oracleデータベース表に書き込みます。デフォルト。
「JDBC出力書式」を参照してください。
oci
: Oracle Call Interface (OCI)接続を使用して、Oracleデータベース表に書き込みます。
「Oracle OCIダイレクト・パス出力形式」を参照してください。
datapump
: 別のユーティリティによる後続のロード用に、データ・ポンプ・ファイルおよび関連するスクリプトをHDFSに作成します。
「Oracle Data Pump出力形式」を参照してください。
text
: デリミタ付きテキスト・ファイルおよび関連するスクリプトをHDFSに作成します。
「デリミタ付きテキスト出力形式」を参照してください。
Oracle XQuery for HadoopでJDBCまたはOCIのいずれかを使用してOracleデータベース表に直接書き込むには、問合せの処理に関連するすべてのシステムがOracle Databaseシステムに接続できる必要があります。「操作モードの概要」を参照してください。
ターゲット表で選択された1つ以上の列名を識別します。列名の順序は、関数パラメータの順序に対応します。「パラメータ」を参照してください。オプション。
この注釈により、表列のサブセットのロードが可能になります。省略すると、put関数はターゲット表のすべての列をロードしようとします。
データベースへの接続およびデータの書込みの様々な側面を制御します。複数の%oracle-property
注釈を指定できます。これらの注釈は、Oracle Loader for Hadoop構成プロパティに対応します。各%oracle-property
注釈には、同等のOracle Loader for Hadoop構成プロパティがあります。この関係の詳細は、「Oracle Loader for Hadoop構成プロパティおよび対応する%oracle-property注釈」を参照してください。
%oracle-property
注釈はオプションです。ただし、様々なロード・シナリオでその一部、または同等の構成プロパティを指定する必要があります。たとえば、JDBCまたはOCIを使用してデータをOracleデータベースにロードするには、ターゲット表および接続情報を指定する必要があります。
次の例は、VISITS
という名前のターゲット表、ユーザー名のdb
、パスワードのpassword
、およびURL接続文字列を指定します。
%oracle-property:targetTable('visits') %oracle-property:connection.user('db') %oracle-property:connection.password('password') %oracle-property:connection.url('jdbc:oracle:thin:@//localhost:1521/orcl.example.com')
パラメータ
すべての列をロードするには、Oracle表の列と同じ順序で各列のパラメータを入力し、選択した列をロードするには、%oracle:columns
注釈を使用します。
パラメータとデータベース列の関係は位置によって決まるため、パラメータの名前(パラメータ構文のcolumn1)はデータベース列の名前と一致する必要はありません。
任意のパラメータで明示的なas xs:allowed_type_name
タイプ宣言は省略できます。たとえば、NUMBER
列に対応するパラメータを単に$column1
として宣言できます。この場合、パラメータはXQueryタイプのitem()*
に自動的に割り当てられます。表6-3に説明するように、入力値は実行時に、対応する表列タイプに対して許容されるXQueryタイプにキャストされます。たとえば、NUMBER
データ型の列にマップされるデータ値は、xs:decimal
として自動的にキャストされます。キャストが失敗すると、エラーが発生します。
あるいは、パラメータのタイプまたはそのサブタイプを指定できます。この場合、コンパイル時タイプのチェックが実行されます。たとえば、NUMBER
列に対応するパラメータを$column as xs:decimal
として宣言できます。また、xs:decimal
のサブタイプ(xs:integer
など)として宣言することもできます。
指定する各パラメータ・タイプにオプションのオカレンス・インジケータ?
を含めることができます。このインジケータを使用すると、実行時に空の順序をパラメータ値として渡すことができ、nullがデータベース表に挿入されます。?
以外のオカレンス・インジケータを使用するとコンパイル時エラーが発生します。
表6-3に、サポートされているOracle Databaseデータ型に対するXQueryデータ型の適切なマッピングを示します。リストされているXQueryデータ型に加えて、xs:decimal
のかわりにxs:integer
を使用するなど、サブタイプも使用できます。Oracleデータ型はXQueryデータ型よりも制限があるため、表ではその制限を説明しています。
表6-3 Oracle DatabaseとXQuery間のデータ型マッピング
Database型 | XQuery型 |
---|---|
|
|
|
|
|
|
|
|
|
紀元前4712年1月1日から西暦9999年12月31日の範囲に制限されます。 |
|
紀元前4712年1月1日から西暦9999年12月31日の範囲に制限されます。 |
|
紀元前4712年1月1日から西暦9999年12月31日の範囲に制限されます。協定世界時からのオフセットで、タイムゾーン時間フィールドは-12:00から14:00に制限されます。小数秒の精度は0から9桁に制限されます。 「セッション・タイムゾーンについて」を参照してください。 |
|
紀元前4712年1月1日から西暦9999年12月31日の範囲に制限されます。協定世界時からのオフセットで、タイムゾーン時間フィールドは-12:00から14:00に制限されます。小数秒の精度は0から9桁に制限されます。 「セッション・タイムゾーンについて」を参照してください。 |
|
日および小数秒の精度は、それぞれ0から9桁に制限されます。時間は0から23、分と秒は0から59の範囲に制限されます。 |
|
年の精度は0から9桁に制限され、月は0から11の範囲に制限されます。 |
|
|
|
|
|
|
|
|
|
|
セッション・タイムゾーンについて
タイムゾーンが指定されていないxs:dateTime
値がTIMESTAMP W TIME ZONE
またはTIMESTAMP W LOCAL TIME ZONE
にロードされると、タイムゾーンはsessionTimeZone
パラメータの値(JVMタイムゾーンにデフォルト設定される)に設定されます。Oracle XQuery for Hadoopを使用して、sessionTimeZone
プロパティを設定できます(「Oracle Loader for Hadoop構成プロパティおよび対応する%oracle-property注釈」を参照)。
注意
JDBCまたはOCI出力モードを使用して、Oracle Databaseアダプタはデータをデータベース表に直接ロードします。さらに、問合せ出力ディレクトリの下に、カスタムput
関数と同じ名前のディレクトリを作成します。たとえば、問合せ出力ディレクトリがmyoutputで、カスタム関数がmyPut
の場合は、myoutput/myPut
ディレクトリが作成されます。
Oracle Databaseアダプタのすべてのカスタムput関数ごとに、個別のディレクトリが作成されます。このディレクトリには、Oracle Loader for Hadoopのジョブで作成された出力が格納されます。datapump
またはtext
出力モードを使用すると、データ・ファイルがこのディレクトリに書き込まれます。ファイルをロードするための制御およびSQLスクリプトは、_olh
サブディレクトリ(例: myoutput/myPut/_olh
)に書き込まれます。
生成されるファイルについては、「デリミタ付きテキスト出力形式」および「Oracle Data Pump出力形式」を参照してください。
次の各例では、HDFS内の次のテキスト・ファイルを使用します。ファイルには、異なるWebページへのアクセス・ログが格納されます。各行はWebページへのアクセスを表し、時間、ユーザー名、アクセスしたページが格納されます。
mydata/visits1.log 2013-10-28T06:00:00, john, index.html, 200 2013-10-28T08:30:02, kelly, index.html, 200 2013-10-28T08:32:50, kelly, about.html, 200 2013-10-30T10:00:10, mike, index.html, 401 mydata/visits2.log 2013-10-30T10:00:01, john, index.html, 200 2013-10-30T10:05:20, john, about.html, 200 2013-11-01T08:00:08, laura, index.html, 200 2013-11-04T06:12:51, kelly, index.html, 200 2013-11-04T06:12:40, kelly, contact.html, 200
この例では、匿名のページ・アクセスが格納されている、HDFS内の次のファイルも使用します。
mydata/anonvisits.log 2011-10-30T10:01:01, index.html, 401 2011-11-04T06:15:40, contact.html, 401
このSQLコマンドでは、VISITS
表がOracleデータベースに作成されます。
CREATE TABLE visits (time TIMESTAMP, name VARCHAR2(15), page VARCHAR2(15), code NUMBER)
最初の問合せは、ページ・アクセスに関連するすべての情報(アクセスの時間、ユーザー名、アクセスしたページ、およびステータス・コード)をVISITS
表にロードします。匿名アクセスの場合はユーザー名が欠落しているため、問合せでは()
を指定してnullを表に挿入します。ターゲット表名、ユーザー名、パスワードおよび接続URLは、%oracle-property
注釈を使用して指定します。
この例ではクリア・テキストのユーザー名とパスワードを使用していますが、セキュリティのために、かわりにウォレットを使用することをお薦めします。Oracle Loader for Hadoopプロパティ、またはそれと同等の%oracle-property
注釈のいずれかを使用して、Oracleウォレットを構成できます。設定が必要な特定のプロパティについては、「オンライン・データベース・モードの接続詳細の指定」を参照してください。
import module "oxh:text"; declare %oracle:put %oracle-property:targetTable('visits') %oracle-property:connection.user('db') %oracle-property:connection.password('password') %oracle-property:connection.url('jdbc:oracle:thin:@//localhost:1521/orcl.example.com') function local:myPut($c1, $c2, $c3, $c4) external; for $line in text:collection("mydata/*visits*.log") let $split := fn:tokenize($line, "\s*,\s*") return if (count($split) > 3) then local:myPut($split[1], $split[2], $split[3], $split[4]) else local:myPut($split[1], (), $split[2], $split[3])
問合せの実行後に、VISITS
表には次のデータが格納されます。
TIME NAME PAGE CODE ------------------------------ --------------- --------------- ---------- 30-OCT-13 10.00.01.000000 AM john index.html 200 30-OCT-13 10.05.20.000000 AM john about.html 200 01-NOV-13 08.00.08.000000 AM laura index.html 200 04-NOV-13 06.12.51.000000 AM kelly index.html 200 04-NOV-13 06.12.40.000000 AM kelly contact.html 200 28-OCT-13 06.00.00.000000 AM john index.html 200 28-OCT-13 08.30.02.000000 AM kelly index.html 200 28-OCT-13 08.32.50.000000 AM kelly about.html 200 30-OCT-13 10.00.10.000000 AM mike index.html 401 30-OCT-11 10.01.01.000000 AM index.html 401 04-NOV-11 06.15.40.000000 AM contact.html 401
この例では、%oracle:columns
注釈を使用して、表のtime
列およびname
列のみをロードします。また、john
によるアクセスのみをロードします。
%oracle:columns
で指定した列名は、put関数パラメータと位置的に関連しています。$c1
パラメータに指定したデータ値はTIME
列にロードされ、$c2
パラメータに指定したデータ値はNAME
列にロードされます。
import module "oxh:text"; declare %oracle:put %oracle:columns('time', 'name') %oracle-property:targetTable('visits') %oracle-property:connection.user('db') %oracle-property:connection.password('password') %oracle-property:connection.url('jdbc:oracle:thin:@//localhost:1521/orcl.example.com') function local:myPut($c1, $c2) external; for $line in text:collection("mydata/*visits*.log") let $split := fn:tokenize($line, "\s*,\s*") where $split[2] eq 'john' return local:myPut($split[1], $split[2])
問合せの実行前にVISITS
表が空の場合、実行後には次のデータが格納されます。
TIME NAME PAGE CODE ------------------------------ --------------- --------------- ---------- 30-OCT-13 10.00.01.000000 AM john 30-OCT-13 10.05.20.000000 AM john 28-OCT-13 06.00.00.000000 AM john
Oracle XQuery for HadoopのOracle Databaseアダプタを使用するときは、Oracle Loader for Hadoopを間接的に使用します。Oracle Loader for Hadoopは、Oracle Databaseへの接続およびデータの書込みの様々な側面を制御する構成プロパティを定義します。Oracle XQuery for Hadoopは、これらのプロパティ(表6-4の最後の列を参照)の多くをサポートしています。
これらのプロパティは、汎用の-conf
および-D
hadoop
コマンドライン・オプションを使用してOracle XQuery for Hadoopに指定できます。この方法を使用して指定されるプロパティは、問合せ内のOracle Databaseアダプタのすべてのput関数に適用されます。hadoop
コマンドライン・オプションの詳細は、「問合せの実行」と特に「汎用オプション」を参照してください。
あるいは、%oracle-property
接頭辞を使用して、これらのプロパティをOracle Databaseアダプタのput関数の注釈として指定できます。これらの注釈は、表6-4の2番目の列を参照してください。注釈は、宣言にその注釈があるOracle Databaseアダプタの特定のput関数にのみ適用されます。
たとえば、ターゲット表をVISITS
に設定するには、次の行を構成ファイルに追加し、-conf
オプションを使用して構成ファイルを指定します。
<property> <name>oracle.hadoop.loader.targetTable</name> <value>visits</value> </property>
また、同じOracle Loader for Hadoopプロパティを使用して、-D
オプションを指定してターゲット表をVISITS
に設定することもできます。
-D oracle.hadoop.loader.targetTable=visits
どちらの方法も、問合せ内のOracle Databaseアダプタのすべてのput関数について、ターゲット表をVISITS
に設定します。
あるいは、この注釈は、宣言に注釈がある特定のput関数の場合のみ、ターゲット表をVISITS
に設定します。
%oracle-property:connection.url('visits')
利便性を考慮して柔軟に設定できます。たとえば、問合せに複数のOracle Databaseアダプタのput関数があり、それぞれが異なる表を同じデータベースに書き込む場合、必要な情報の指定に最も利便性の高い方法は次のとおりです。
oracle.hadoop.loader.connection.url
プロパティを構成ファイルで使用し、データベース接続URLを指定します。次に、-conf
オプションを使用して構成ファイルを指定します。このオプションにより、問合せ内のOracle Databaseアダプタのすべてのput関数について同じデータベース接続URLが設定されます。
Oracle Databaseアダプタの各put関数宣言で%oracle-property:targetTable
注釈を使用して、異なる表名を設定します。
表6-4に、Oracle Loader for Hadoopプロパティおよびそれと同等のOracle XQuery for Hadoop注釈を機能カテゴリ別に示します。Oracle XQuery for Hadoopは、この表に示されているOracle Loader for Hadoopプロパティのみサポートしています。
表6-4 構成プロパティおよび対応する%oracle-property注釈
カテゴリ | プロパティ | 注釈 |
---|---|---|
接続 |
|
|
接続 |
|
|
接続 |
|
|
接続 |
|
|
接続 |
|
|
接続 |
|
|
接続 |
|
|
接続 |
|
|
接続 |
|
|
一般 |
|
|
一般 |
|
|
一般 |
|
|
一般 |
|
|
一般 |
|
|
一般 |
|
|
一般 |
|
|
一般 |
|
|
一般 |
|
|
一般 |
|
|
出力 |
|
|
出力 |
|
|
出力 |
|
|
出力 |
|
|
出力 |
|
|
出力 |
|
|
サンプラ |
|
|
サンプラ |
|
|
サンプラ |
|
|
サンプラ |
|
|
サンプラ |
|
|
サンプラ |
|
|
サンプラ |
|
|
サンプラ |
|
|
サンプラ |
|
|