Oracle® Big Data Connectors

ユーザーズ・ガイド

リリース4 (4.4)

E70118-04(原本部品番号:E65668-07)

2016年5月

Oracle Big Data Connectors (Oracle SQL Connector for Hadoop Distributed File System、Oracle Loader for Hadoop、Oracle Data Integrator、Oracle XQuery for HadoopおよびOracle R Advanced Analytics for Hadoop)のインストールと使用について説明します。

Oracle Big Data Connectorsユーザーズ・ガイド, リリース4 (4.4)

E70118-04

Copyright © 2011, 2016, Oracle and/or its affiliates.  All rights reserved.

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXはThe Open Groupの登録商標です。

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

目次

タイトルおよび著作権情報

はじめに

- 対象読者

- 関連ドキュメント

- テキストの表記規則

- 構文の表記規則

Oracle Big Data Connectorsユーザーズ・ガイドのこのリリースでの変更点

- Oracle Big Data Connectorsリリース4 (4.4)の変更点

- Oracle Big Data Connectorsリリース4 (4.3)の変更点

- Oracle Big Data Connectorsリリース4 (4.2)の変更点

- Oracle Big Data Connectorsリリース4 (4.1)の変更点

- Oracle Big Data Connectorsリリース4 (4.0)の変更点

第I部 設定

1 Oracle Big Data Connectorsを使用する前に

- 1.1 Oracle Big Data Connectorsについて

- 1.2 ビッグ・データの概念とテクノロジ

- 1.2.1 MapReduceとは

- 1.2.2 Apache Hadoopとは

- 1.3 Oracle Big Data Connectorsソフトウェアのダウンロード

- 1.4 Oracle SQL Connector for Hadoop Distributed File Systemの設定

- 1.4.1 ソフトウェア要件

- 1.4.1.1 HadoopクライアントへのRのインストール

- 1.4.2 Oracle DatabaseシステムへのHadoopクライアントのインストールと構成

- 1.4.3 Oracle SQL Connector for HDFSのインストール

- 1.4.4 Oracle Databaseに対するユーザー・アクセス権の付与

- 1.4.5 Oracle Databaseシステムへのユーザー・アカウントの設定

- 1.4.6 セキュアなHadoopクラスタでのOracle SQL Connector for HDFSの使用

- 1.5 Oracle Loader for Hadoopの設定

- 1.5.1 ソフトウェア要件

- 1.5.2 Oracle Loader for Hadoopのインストール

- 1.5.3 オフライン・データベース・モードのサポート

- 1.5.4 セキュアなHadoopクラスタでのOracle Loader for Hadoopの使用

- 1.6 Oracle XQuery for Hadoopの設定

- 1.6.1 ソフトウェア要件

- 1.6.2 Oracle XQuery for Hadoopのインストール

- 1.6.3 ファイル・パスのトラブルシューティング

- 1.6.4 Oracle XQuery for HadoopアクションのOozieの構成

- 1.7 Oracle R Advanced Analytics for Hadoopの設定

- 1.7.1 Hadoopへのソフトウェアのインストール

- 1.7.1.1 サードパーティHadoopクラスタのソフトウェア要件

- 1.7.1.2 サードパーティHadoopクラスタへのSqoopのインストール

- 1.7.1.3 サードパーティHadoopクラスタへのHiveのインストール

- 1.7.1.4 サードパーティHadoopクラスタへのRのインストール

- 1.7.1.5 サードパーティHadoopクラスタへのORCHパッケージのインストール

- 1.7.2 追加のRパッケージのインストール

- 1.7.3 Rユーザーへのリモート・クライアント・アクセスの提供

- 1.7.3.1 リモート・クライアント・アクセスのソフトウェア要件

- 1.7.3.2 Hadoopクライアントとしてのサーバーの構成

- 1.7.3.3 HadoopクライアントへのSqoopのインストール

- 1.7.3.4 HadoopクライアントへのRのインストール

- 1.7.3.5 HadoopクライアントへのORCHパッケージのインストール

- 1.7.3.6 Oracle R Enterpriseクライアントのパッケージ(オプション)のインストール

- 1.8 Oracle Data Integrator

第II部 Oracle Databaseのコネクタ

2 Oracle SQL Connector for Hadoop Distributed File System

- 2.1 Oracle SQL Connector for HDFSについて

- 2.1.1 AvroとXML間の値の変換について

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

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

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

- 2.5 ExternalTableコマンドライン・ツールの使用方法

- 2.5.1 ExternalTableの概要

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

- 2.6 外部表の作成

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

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

- 2.6.2.1 必須プロパティ

- 2.6.2.2 オプションのプロパティ

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

- 2.6.2.4 例

- 2.6.3 Hive表からの外部表の作成

- 2.6.3.1 Hive表の要件

- 2.6.3.2 データ型のマッピング

- 2.6.3.3 必須プロパティ

- 2.6.3.4 オプションのプロパティ

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

- 2.6.3.6 例

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

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

- 2.6.3.7.2 メタデータ表の問合せ

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

- 2.6.3.7.4 エラー・メッセージ

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

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

- 2.6.4.1 データ型のマッピング

- 2.6.4.2 必須プロパティ

- 2.6.4.3 オプションのプロパティ

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

- 2.6.4.5 例

- 2.6.5 SQLでの外部表の作成

- 2.7 HDFSデータ・パスの公開

- 2.7.1 公開用のExternalTable構文

- 2.7.2 公開用のExternalTableの例

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

- 2.8.1 情報表示のためのExternalTable構文

- 2.8.2 情報表示のためのExternalTableの例

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

- 2.9.1 削除のためのExternalTable構文

- 2.9.2 削除のためのExternalTableの例

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

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

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

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

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

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

- 2.10.2 場所ファイルとは

- 2.10.3 並列処理の有効化

- 2.10.3.1 並列度の設定

- 2.10.4 場所ファイルの管理

- 2.10.5 場所ファイルの名前

- 2.11 Oracle SQL Connector for HDFSの構成

- 2.11.1 構成ファイルの作成

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

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

3 Oracle Loader for Hadoop

- 3.1 Oracle Loader for Hadoopとは

- 3.2 操作モードの概要

- 3.2.1 オンライン・データベース・モード

- 3.2.2 オフライン・データベース・モード

- 3.3 Oracle Loader for Hadoopを使用する前に

- 3.4 ターゲット表の作成

- 3.4.1 ターゲット表でサポートされるデータ型

- 3.4.2 ターゲット表でサポートされるパーティション化方式

- 3.4.3 圧縮

- 3.5 ジョブ構成ファイルの作成

- 3.6 ターゲット表のメタデータの概要

- 3.6.1 オンライン・データベース・モードの接続詳細の指定

- 3.6.2 ターゲット表メタデータの生成(オフライン・データベース・モードの場合)

- 3.6.2.1 OraLoaderMetadataユーティリティ

- 3.7 入力形式の概要

- 3.7.1 デリミタ付きテキスト入力形式

- 3.7.1.1 DelimitedTextInputFormatの概要

- 3.7.1.2 必須の構成プロパティ

- 3.7.1.3 オプションの構成プロパティ

- 3.7.2 複合テキスト入力形式

- 3.7.2.1 RegexInputFormatの概要

- 3.7.2.2 必須の構成プロパティ

- 3.7.2.3 オプションの構成プロパティ

- 3.7.3 Hive表入力形式

- 3.7.3.1 HiveToAvroInputFormatの概要

- 3.7.3.2 必須の構成プロパティ

- 3.7.3.3 オプションの構成プロパティ

- 3.7.4 Avro入力形式

- 3.7.4.1 構成プロパティ

- 3.7.5 Oracle NoSQL Database入力形式

- 3.7.5.1 KVAvroInputFormatの概要

- 3.7.5.2 必須の構成プロパティ

- 3.7.6 カスタム入力形式

- 3.7.6.1 カスタム入力形式の実装の概要

- 3.7.6.2 エラー処理の概要

- 3.7.6.3 データ・サンプリングのサポート

- 3.7.6.4 InputFormatのサンプル・ソース・コード

- 3.8 ターゲット表列への入力フィールドのマッピング

- 3.8.1 自動マッピング

- 3.8.2 手動マッピング

- 3.8.3 ローダー・マップ・ファイルの変換

- 3.9 出力形式の概要

- 3.9.1 JDBC出力形式

- 3.9.1.1 JDBCOutputFormatの概要

- 3.9.1.2 構成プロパティ

- 3.9.2 Oracle OCIダイレクト・パス出力形式

- 3.9.2.1 OCIOutputFormatの概要

- 3.9.2.2 構成プロパティ

- 3.9.3 デリミタ付きテキスト出力形式

- 3.9.3.1 DelimitedTextOutputFormatの概要

- 3.9.3.2 構成プロパティ

- 3.9.4 Oracle Data Pump出力形式

- 3.9.4.1 DataPumpOutputFormatの概要

- 3.10 ローダー・ジョブの実行

- 3.10.1 Hive入力形式のJARファイルの指定

- 3.10.2 Oracle NoSQL Database入力形式のJARファイルの指定

- 3.10.3 ジョブのレポート作成

- 3.11 拒否されたレコードの処理

- 3.11.1 拒否されたレコードの不正なファイルへのロギング

- 3.11.2 ジョブの拒否制限の設定

- 3.12 パーティション化表にデータをロードする場合のロード・バランシング

- 3.12.1 サンプリング機能の使用方法

- 3.12.2 ロード・バランシングのチューニング

- 3.12.3 サンプリング動作のチューニング

- 3.12.4 Oracle Loader for Hadoopがサンプラのパーティション化スキームを使用するのはどのような場合か

- 3.12.5 メモリーの問題の解決

- 3.12.6 サンプリング機能のプロパティの値が無効な場合

- 3.13 Oracleエンジニアド・システム間の通信の最適化

- 3.14 Oracle Loader for Hadoop構成プロパティ・リファレンス

- 3.15 同梱されているソフトウェアのサードパーティ・ライセンス

- 3.15.1 Apache Licensed Code

- 3.15.2 Apache License

- 3.15.2.1 Apache Avro 1.7.3

- 3.15.2.2 Apache Commons Mathematics Library 2.2

- 3.15.2.3 Jackson JSON 1.8.8

第III部 Oracle XQuery for Hadoop

4 Oracle XQuery for Hadoopの使用

- 4.1 Oracle XQuery for Hadoopとは

- 4.2 Oracle XQuery for Hadoopを使用する前に

- 4.2.1 基本的な手順

- 4.2.2 例: Hello World!

- 4.3 Oracle XQuery for Hadoopの関数について

- 4.3.1 アダプタについて

- 4.3.2 Oracle XQuery for Hadoopで使用する他のモジュールについて

- 4.4 XQuery変換の作成

- 4.4.1 XQuery変換の要件

- 4.4.2 XQuery言語のサポートについて

- 4.4.3 Hadoop分散キャッシュのデータへのアクセス

- 4.4.4 XQueryからのカスタムJava関数の呼出し

- 4.4.5 ユーザー定義のXQueryライブラリ・モジュールおよびXMLスキーマのアクセス

- 4.4.6 XQuery変換の例

- 4.5 問合せの実行

- 4.5.1 Oracle XQuery for Hadoopのオプション

- 4.5.2 汎用オプション

- 4.5.3 ローカルでの問合せの実行について

- 4.6 Apache Oozieからの問合せの実行

- 4.6.1 Oracle XQuery for HadoopのOozieアクションの使用に関する概要

- 4.6.2 サポートされているXML要素

- 4.6.3 例: Hello World

- 4.7 Oracle XQuery for Hadoopの構成プロパティ

- 4.8 同梱されているソフトウェアのサードパーティ・ライセンス

- 4.8.1 Apache Licensed Code

- 4.8.2 Apache License

- 4.8.3 ANTLR 3.2

- 4.8.4 Apache Ant 1.7.1

- 4.8.5 Apache Xerces 2.9.1

- 4.8.6 Apache XMLBeans 2.3, 2.5

- 4.8.7 Jackson 1.8.8

- 4.8.8 Woodstox XML Parser 4.2.0

5 Oracle XQuery for Hadoopリファレンス

- 5.1 Avroファイル・アダプタ

- 5.1.1 Avroファイルを読み取る組込み関数

- 5.1.1.1 avro:collection-avroxml

- 5.1.1.2 avro:get

- 5.1.2 Avroコンテナ・ファイルを読み取るカスタム関数

- 5.1.3 Avroファイルを書き込むカスタム関数

- 5.1.4 Avroファイル・アダプタの関数の例

- 5.1.5 AvroとXML間の値の変換について

- 5.1.5.1 XMLとしてのAvroの読取り

- 5.1.5.1.1 レコードの読取り

- 5.1.5.1.2 マップの読取り

- 5.1.5.1.3 配列の読取り

- 5.1.5.1.4 共用体の読取り

- 5.1.5.1.5 プリミティブの読取り

- 5.1.5.2 AvroとしてのXMLの書込み

- 5.1.5.2.1 レコードの書込み

- 5.1.5.2.2 マップの書込み

- 5.1.5.2.3 配列の書込み

- 5.1.5.2.4 共用体の書込み

- 5.1.5.2.5 プリミティブの書込み

- 5.2 JSONファイル・アダプタ

- 5.2.1 JSONを読み取る組込み関数

- 5.2.1.1 json:collection-jsonxml

- 5.2.1.2 json:parse-as-xml

- 5.2.1.3 json:get

- 5.2.2 JSONファイルを読み取るカスタム関数

- 5.2.3 JSON関数の例

- 5.2.4 JSONファイル・アダプタの構成プロパティ

- 5.2.5 XMLへのJSONデータ形式の変換について

- 5.2.5.1 JSONオブジェクトからXMLへの変換について

- 5.2.5.2 JSON配列からXMLへの変換について

- 5.2.5.3 他のJSONタイプの変換について

- 5.3 Oracle Databaseアダプタ

- 5.3.1 Oracle Databaseに書き込むカスタム関数

- 5.3.2 Oracle Databaseアダプタの関数の例

- 5.3.3 Oracle Loader for Hadoop構成プロパティおよび対応する%oracle-property注釈

- 5.4 Oracle NoSQL Databaseアダプタ

- 5.4.1 Oracle NoSQL Databaseアダプタを使用するための前提条件

- 5.4.2 Oracle NoSQL Databaseに対して読取りおよび書込みを実行する組込み関数

- 5.4.2.1 kv:collection-text

- 5.4.2.2 kv:collection-avroxml

- 5.4.2.3 kv:collection-xml

- 5.4.2.4 kv:collection-binxml

- 5.4.2.5 kv:collection-tika

- 5.4.2.6 kv:put-text

- 5.4.2.7 kv:put-xml

- 5.4.2.8 kv:put-binxml

- 5.4.2.9 kv:get-text

- 5.4.2.10 kv:get-avroxml

- 5.4.2.11 kv:get-xml

- 5.4.2.12 kv:get-binxml

- 5.4.2.13 kv:get-tika

- 5.4.2.14 kv:key-range

- 5.4.2.15 kv:key-range

- 5.4.3 表APIを使用してOracle NoSQL Databaseに対して読取りおよび書込みを実行する組込み関数

- 5.4.3.1 kv-table:collection-jsontext

- 5.4.3.2 kv-table:get-jsontext

- 5.4.3.3 kv-table:put-jsontext

- 5.4.4 ラージ・オブジェクトAPIを使用してOracle NoSQL Databaseに対して読取りおよび書込みを実行する組込み関数

- 5.4.4.1 kv-lob:get-text

- 5.4.4.2 kv-lob:get-xml

- 5.4.4.3 kv-lob:get-binxml

- 5.4.4.4 kv-lob:get-tika

- 5.4.4.5 kv-lob:put-text

- 5.4.4.6 kv-lob:put-xml

- 5.4.4.7 kv-lob:put-binxml

- 5.4.5 Oracle NoSQL Databaseから値を読み取るカスタム関数

- 5.4.6 Oracle NoSQL Databaseから単一値を取得するためのカスタム関数

- 5.4.7 表APIを使用してOracle NoSQL Databaseから値を読み取るカスタム関数

- 5.4.8 表APIを使用してOracle NoSQL Databaseから単一列を読み取るカスタム関数

- 5.4.9 ラージ・オブジェクトAPIを使用してOracle NoSQL Databaseから単一値を取得するためのカスタム関数

- 5.4.10 Oracle NoSQL Databaseに書き込むカスタム関数

- 5.4.11 表APIを使用してOracle NoSQL Databaseに値を書き込むカスタム関数

- 5.4.12 ラージ・オブジェクトAPIを使用してOracle NoSQL Databaseに値を書き込むカスタム関数

- 5.4.13 Oracle NoSQL Databaseアダプタの関数の例

- 5.4.14 Oracle NoSQL Databaseアダプタの構成プロパティ

- 5.5 順序ファイル・アダプタ

- 5.5.1 順序ファイルの読取りおよび書込みを実行する組込み関数

- 5.5.1.1 seq:collection

- 5.5.1.2 seq:collection-xml

- 5.5.1.3 seq:collection-binxml

- 5.5.1.4 seq:collection-tika

- 5.5.1.5 seq:put

- 5.5.1.6 seq:put-xml

- 5.5.1.7 seq:put-binxml

- 5.5.2 順序ファイルを読み取るカスタム関数

- 5.5.3 順序ファイルを書き込むカスタム関数

- 5.5.4 順序ファイル・アダプタの関数の例

- 5.6 Solrアダプタ

- 5.6.1 Solrアダプタを使用するための前提条件

- 5.6.1.1 構成設定

- 5.6.1.2 Solrアダプタを使用した問合せの例

- 5.6.2 データをSolrサーバーにロードするための組込み関数

- 5.6.2.1 solr:put

- 5.6.3 データをSolrサーバーにロードするためのカスタム関数

- 5.6.4 Solrアダプタの関数の例

- 5.6.5 Solrアダプタ構成プロパティ

- 5.7 テキスト・ファイル・アダプタ

- 5.7.1 テキスト・ファイルの読取りおよび書込みを実行する組込み関数

- 5.7.1.1 text:collection

- 5.7.1.2 text:collection-xml

- 5.7.1.3 text:put

- 5.7.1.4 text:put-xml

- 5.7.1.5 text:trace

- 5.7.2 テキスト・ファイルを読み取るカスタム関数

- 5.7.3 テキスト・ファイルを書き込むカスタム関数

- 5.7.4 テキスト・ファイル・アダプタの関数の例

- 5.8 Tikaファイル・アダプタ

- 5.8.1 Tikaを使用してファイルを解析するための組込みライブラリ関数

- 5.8.1.1 tika:collection

- 5.8.1.2 tika:parse

- 5.8.2 Tikaを使用してファイルを解析するためのカスタム関数

- 5.8.3 Tikaパーサーの出力形式

- 5.8.4 Tikaアダプタの構成プロパティ

- 5.8.5 Tikaファイル・アダプタの関数の例

- 5.9 XMLファイル・アダプタ

- 5.9.1 XMLファイルを読み取る組込み関数

- 5.9.1.1 xmlf:collection (単一のタスク)

- 5.9.1.2 xmlf:collection-multipart (単一のタスク)

- 5.9.1.3 xmlf:collection (複数のタスク)

- 5.9.2 XMLファイルを読み取るカスタム関数

- 5.9.3 XMLファイル・アダプタの関数の例

- 5.10 ユーティリティ・モジュール

- 5.10.1 期間、日付および時刻のOracle XQuery関数

- 5.10.1.1 ora-fn:date-from-string-with-format

- 5.10.1.2 ora-fn:date-to-string-with-format

- 5.10.1.3 ora-fn:dateTime-from-string-with-format

- 5.10.1.4 ora-fn:dateTime-to-string-with-format

- 5.10.1.5 ora-fn:time-from-string-with-format

- 5.10.1.6 ora-fn:time-to-string-with-format

- 5.10.1.7 Format引数

- 5.10.1.8 Locale引数

- 5.10.2 文字列のOracle XQuery関数

- 5.10.2.1 ora-fn:pad-left

- 5.10.2.2 ora-fn:pad-right

- 5.10.2.3 ora-fn:trim

- 5.10.2.4 ora-fn:trim-left

- 5.10.2.5 ora-fn:trim-right

- 5.11 Hadoopモジュール

- 5.11.1 Hadoopを使用するための組込み関数

- 5.11.1.1 oxh:find

- 5.11.1.2 oxh:increment-counter

- 5.11.1.3 oxh:println

- 5.11.1.4 oxh:println-xml

- 5.11.1.5 oxh:property

- 5.12 シリアライズ注釈

6 Oracle XML Extensions for Hive

- 6.1 XML Extensions for Hiveとは

- 6.2 Hive拡張の使用

- 6.3 Hive関数について

- 6.4 XML表の作成

- 6.4.1 XML表に対するHiveのCREATE TABLE構文

- 6.4.2 CREATE TABLE構成プロパティ

- 6.4.3 CREATE TABLEの例

- 6.4.3.1 構文の例

- 6.4.3.2 簡単な例

- 6.4.3.3 OpenStreetMapの例

- 6.1 Hive用のOracle XML関数のリファレンス

- 6.1.1 データ型変換

- 6.1.2 外部ファイルへのHiveアクセス

- 6.2 関数のオンライン・マニュアル

- 6.3 xml_exists

- 6.4 xml_query

- 6.5 xml_query_as_primitive

- 6.6 xml_table

第IV部 Oracle R Advanced Analytics for Hadoop

7 Oracle R Advanced Analytics for Hadoopの使用

- 7.1 Oracle R Advanced Analytics for Hadoopについて

- 7.1.1 Oracle R Advanced Analytics for Hadoopアーキテクチャ

- 7.1.2 Oracle R Advanced Analytics for Hadoopパッケージおよび関数

- 7.1.3 Oracle R Advanced Analytics for HadoopのAPI

- 7.1.4 Oracle R Advanced Analytics for Hadoopへの入力

- 7.2 HDFSファイルへのアクセス

- 7.3 Apache Hiveへのアクセス

- 7.3.1 HiveのORCH関数

- 7.3.2 HiveのORE関数

- 7.3.3 Hiveでサポートされる一般的なR関数

- 7.3.4 Hiveデータ型のサポート

- 7.3.5 Hiveアクセスの使用上の注意

- 7.3.6 例: Oracle R Advanced Analytics for HadoopへのHive表のロード

- 7.4 Oracle Databaseへのアクセス

- 7.4.1 Oracle Databaseアクセスの使用上の注意

- 7.4.2 Oracle R EnterpriseでOracle R Advanced Analytics for Hadoopを使用する場合のシナリオ

- 7.5 Oracle R Advanced Analytics for Hadoop関数

- 7.5.1 ネイティブ分析関数

- 7.5.2 Hadoop Distributed File System (HDFS)の使用

- 7.5.3 Apache Hiveの使用

- 7.5.4 Hiveでの集計関数の使用

- 7.5.5 データベース接続の確立

- 7.5.6 データのコピーおよびHDFSファイルの操作

- 7.5.7 Rデータ型への変換

- 7.5.8 MapReduceの使用

- 7.5.9 スクリプトのデバッグ

- 7.6 Oracle R Advanced Analytics for Hadoop関数のデモ

- 7.7 Oracle R Advanced Analytics for Hadoopのセキュリティ上の注意

索引

はじめに

『Oracle Big Data Connectorsユーザーズ・ガイド』では、Oracle Big Data Connectorsのインストール方法と使用方法について説明します。

- Oracle Loader for Hadoop

- Oracle SQL Connector for Hadoop Distributed File System

- Oracle XQuery for Hadoop

- Oracle R Advanced Analytics for Hadoop

- Oracle Data Integrator[1]

対象読者

このドキュメントは、次のユーザーなどのOracle Big Data Connectorsのユーザーを対象としています。

- アプリケーション開発者

- Javaプログラマ

- XQueryプログラマ

- システム管理者

- データベース管理者

関連ドキュメント

詳細は、次のドキュメントを参照してください。

- Oracle Loader for Hadoop Java APIリファレンス

- Oracle Fusion Middleware Oracle Data Integratorアプリケーション・アダプタ・ガイド

- 『Oracle Big Data Applianceソフトウェア・ユーザーズ・ガイド』

テキストの表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

構文の表記規則

構文は、次の記号と表記規則を使用するバッカスナウア記法(BNF)の単純なバリエーションで示されます。

記号または規則

説明

[ ]

大カッコは、オプション項目を囲みます。

{ }

中カッコは、選択項目を囲み、そのうち1つのみが必須です。

|

縦線は、大カッコまたは中カッコ内の代替項目を区切ります。

...

省略記号は、先行する構文要素を反復できることを示します。

デリミタ

大カッコ、中カッコおよび縦線以外のデリミタは、記載されているとおりに入力する必要があります。

[1]
Oracle Big Data Connectorsには、Oracle Big Data Appliance上でライセンス付与された場合、Oracle Data Integratorの制限付き使用のライセンスが含まれます。ただし、別のHadoopクラスタ上で使用する場合、追加のライセンスが必要です。

Oracle Big Data Connectorsユーザーズ・ガイドのこのリリースでの変更点

内容は次のとおりです。

- Oracle Big Data Connectorsリリース4 (4.4)の変更点

- Oracle Big Data Connectorsリリース4 (4.3)の変更点

- Oracle Big Data Connectorsリリース4 (4.2)の変更点

- Oracle Big Data Connectorsリリース4 (4.1)の変更点

- Oracle Big Data Connectorsリリース4 (4.0)の変更点

Oracle Big Data Connectorsリリース4 (4.4)の変更点

Oracle Big Data Connectorsリリース4 (4.4)の『Oracle Big Data Connectorsユーザーズ・ガイド』の変更点は次のとおりです。

この表に、Oracle Big Data Connectors 4.4とともにインストールされるソフトウェアのバージョンを示します。

コネクタ

バージョン

Oracle SQL Connector for HDFS

3.4.0

Oracle Loader for Hadoop [1]

3.5.0

Oracle XQuery for Hadoop

4.2.1

Oracle R Advanced Analytics for Hadoop

2.4.0

Oracle Data Integrator[2]

12.2.1

新機能

Oracle Big Data Connectorsリリース4 (4.3)の変更点

Oracle Big Data Connectorsリリース4 (4.3)の『Oracle Big Data Connectorsユーザーズ・ガイド』の変更点は次のとおりです。

この表に、Oracle Big Data Connectors 4.3とともにインストールされるソフトウェアのバージョンを示します。

コネクタ

バージョン

Oracle SQL Connector for HDFS

3.4.0

Oracle Loader for Hadoop [3]

3.5.0

Oracle XQuery for Hadoop

4.2.1

Oracle R Advanced Analytics for Hadoop

2.4.0

Oracle Data Integrator[4]

12.1.3.0

新機能

Oracle Big Data Connectorsリリース4 (4.2)の変更点

Oracle Big Data Connectorsリリース4 (4.2)の『Oracle Big Data Connectorsユーザーズ・ガイド』の変更点は次のとおりです。

この表に、Oracle Big Data Connectors 4.2とともにインストールされるソフトウェアのバージョンを示します。

コネクタ

バージョン

Oracle SQL Connector for HDFS

3.3.0

Oracle Loader for Hadoop

3.4.0

Oracle XQuery for Hadoop[5]

4.2.0

Oracle R Advanced Analytics for Hadoop

2.4.0

Oracle Data Integrator[6]

12.1.3.0

Oracle Big Data Connectorsリリース4 (4.1)の変更点

Oracle Big Data Connectorsリリース4 (4.1)の『Oracle Big Data Connectorsユーザーズ・ガイド』の変更点は次のとおりです。

この表に、Oracle Big Data Connectors 4.1とともにインストールされるソフトウェアのバージョンを示します。

コネクタ

バージョン

Oracle SQL Connector for HDFS

3.3.0

Oracle Loader for Hadoop

3.3.0

Oracle XQuery for Hadoop

4.2.0

Oracle R Advanced Analytics for Hadoop

2.4.0

Oracle Data Integrator[7]

12.1.3.0

Oracle Big Data Connectorsリリース4 (4.0)の変更点

Oracle Big Data Connectorsリリース4 (4.0)の『Oracle Big Data Connectorsユーザーズ・ガイド』の変更点は次のとおりです。

この表に、Oracle Big Data Connectors 4.0とともにインストールされるソフトウェアのバージョンを示します。

コネクタ

バージョン

Oracle SQL Connector for HDFS

3.1

Oracle Loader for Hadoop

3.2

Oracle Data Integrator Application Adapter for Hadoop[8]

12.1.3.0

Oracle XQuery for Hadoop

4.0.1

Oracle R Advanced Analytics for Hadoop

2.4

[1]
Oracle Loader for Hadoop 3.5は、Hive表からロードされたデータの個々のレコード・レベルでのフィルタリングをサポートします。以前は、Hiveデータのフィルタリングはパーティション・レベルでのみ可能でした。

[2]
Oracle Data Integratorを設定および使用するための要件と手順の詳細は、Oracle® Fusion Middlewareビッグ・データとOracle Data Integratorの統合を参照してください。

[3]
Oracle Loader for Hadoop 3.5は、Hive表からロードされたデータの個々のレコード・レベルでのフィルタリングをサポートします。以前は、Hiveデータのフィルタリングはパーティション・レベルでのみ可能でした。

[4]
Oracle Data Integratorの設定および使用に関する要件および手順の詳細は、『Oracle Fusion Middleware Oracle Data Integratorアプリケーション・アダプタ・ガイド』の「Hadoop」の章を参照してください。

[5]
Oracle NoSQL Database表APIおよびOracle NoSQL Databaseラージ・オブジェクトAPIのサポートが追加されています。Oracle NoSQL Database表API関数を操作するには、Oracle NoSQL Database 3.1以上が必要です。

[6]
Oracle Data Integratorの設定および使用に関する要件および手順の詳細は、『Oracle Fusion Middleware Oracle Data Integratorアプリケーション・アダプタ・ガイド』の「Hadoop」の章を参照してください。

[7]
Oracle Data Integratorの設定および使用に関する要件および手順の詳細は、『Oracle Fusion Middleware Oracle Data Integratorアプリケーション・アダプタ・ガイド』の「Hadoop」の章を参照してください。

[8]
Oracle Data Integrator Application Adapter for Hadoopの設定および使用に関する要件および手順の詳細は、『Oracle Fusion Middleware Oracle Data Integratorアプリケーション・アダプタ・ガイド』の「Hadoop」の章を参照してください。

第I部 設定

第I部には次の章が含まれます。

- Oracle Big Data Connectorsを使用する前に

1 Oracle Big Data Connectorsを使用する前に

この章では、Oracle Big Data Connectorsについて説明し、インストール手順を示します。

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

- Oracle Big Data Connectorsについて

- ビッグ・データの概念とテクノロジ

- Oracle Big Data Connectorsソフトウェアのダウンロード

- Oracle SQL Connector for Hadoop Distributed File Systemの設定

- Oracle Loader for Hadoopの設定

- Oracle XQuery for Hadoopの設定

- Oracle R Advanced Analytics for Hadoopの設定

- Oracle Data Integrator

1.1 Oracle Big Data Connectorsについて

Oracle Big Data Connectorsを使用すると、Apache Hadoopクラスタに格納されているデータへのアクセスが簡単になります。Oracle Big Data Applianceまたはコモディティ・ハードウェア上で稼働するHadoopクラスタでの使用に対してライセンス供与されます。

次のコネクタがあります。

- Oracle SQL Connector for Hadoop Distributed File System (旧Oracle Direct Connector for HDFS): Oracle外部表は、Hadoop Distributed File System (HDFS)ファイルまたはApache Hiveの表に格納されているデータにアクセスできます。データをHDFSまたはHive表に保持することも、Oracle Databaseにロードすることもできます。

- Oracle Loader for Hadoop: HadoopクラスタからOracle Databaseの表にデータをすばやく移動するための効率的でパフォーマンスのよいローダーを提供します。Oracle Loader for Hadoopは、必要に応じてデータを事前にパーティション化し、そのデータをデータベース対応形式に変換します。また、データのロードや出力ファイルの作成の前に主キーまたはユーザー定義の列でレコードを任意にソートします。

- Oracle XQuery for Hadoop: XQuery言語で表された変換を一連のMapReduceジョブに解釈して実行します(これらのジョブはHadoopクラスタ上で並列で実行されます)。入力データは、Hadoop Distributed File System (HDFS)など、Hadoopのファイル・システムAPIを介してアクセス可能なファイル・システムに配置するか、Oracle NoSQL Databaseに格納できます。Oracle XQuery for Hadoopでは、変換結果をHDFS、Oracle NoSQL Database、Apache SolrまたはOracle Databaseに書き込むことができます。追加のXML処理機能は、XML Extensions for Hiveを通じて提供されます。

- Oracle R Advanced Analytics for Hadoop: 汎用計算フレームワークを提供します。このフレームワークでは、R言語を使用してカスタム・ロジックをマッパーまたはレデューサとして作成できます。Rパッケージのコレクションにより、MapReduceジョブとして実行される予測分析法が提供されます。コードは、Hadoopクラスタで使用可能な計算リソースとストレージ・リソースを使用する分散並列方式で実行されます。Oracle R Advanced Analytics for Hadoopには、Apache Hive表、Apache Hadoop計算インフラストラクチャ、ローカルR環境およびOracleデータベース表を操作するインタフェースが組み込まれています。

- Oracle Data Integrator: ファイルおよびデータベースなどのソースからHadoopに、またはHadoopからOracleやその他のサードパーティ・データベースに、データを抽出、ロードおよび変換します。Oracle Data Integratorは、ネイティブなHadoopツールを使用するグラフィカルなユーザー・インタフェースおよびHive、HBase、Sqoop、Oracle Loader for HadoopおよびOracle SQL Connector for Hadoop Distributed File Systemなどの変換エンジンを提供します。

それぞれのコネクタでは、Oracle Databaseと、Hadoopクラスタまたはクラスタに対してHadoopクライアントとして設定した外部システムにソフトウェア・コンポーネントをインストールする必要があります。Oracle Databaseでの追加のアクセス権限が必要な場合もあります。Oracle Database and Apache Hadoopとの統合の詳細は、動作保証マトリックスを参照してください。

関連項目:

My Oracle Support情報センター: Big Data Connectors (ID 1487399.2)およびその関連情報センター

1.2 ビッグ・データの概念とテクノロジ

エンタープライズでは、複数のソースから生じる大量のデータを参照します。分析した場合にエンタープライズにとってきわめて大きな価値となる膨大な量のデータのほんの一例として、Webログのクリックストリーム・データ、GPS追跡情報、小売事業のデータ、センサー・データおよびマルチメディア・ストリームなどがあります。生のデータ・フィードから取得する非構造化および半構造化情報は、それ自体ほとんど価値はありません。実際に価値のある情報を抽出するには、データを処理する必要があります。処理されたデータは、その後データベースに格納して管理できます。このデータをデータベースの構造化データと一緒に分析することで、新たな理解が得られ、実質的なビジネス利益につながります。

1.2.1 MapReduceとは

MapReduceは、分散システムでデータを処理するための並列プログラミング・モデルです。大量のデータを迅速に処理し、線形的に拡張できます。特に、非構造化データおよび半構造化データのバッチ処理のメカニズムとして効果的です。MapReduceは、比較的下位の操作を一連のキーと値を通じて計算に抽象化します。

MapReduceジョブを簡単に定義すると、2つのフェーズ(マップ・フェーズとリデュース・フェーズ)が連続的に交代する操作になります。各マップ・フェーズは、入力データの各レコードに変換機能を適用して、キーと値のペアで表現される一連のレコードを作成します。マップ・フェーズからの出力は、リデュース・フェーズへの入力になります。リデュース・フェーズでは、マップ出力レコードはキーと値のセットにソートされるため、セット内のすべてのレコードのキーの値が同じになります。リデューサ関数がセット内のすべてのレコードに適用され、一連の出力レコードがキーと値のペアで作成されます。マップ・フェーズは、各レコードに対して論理的に並列で実行され、リデュース・フェーズは、すべてのキーの値に対して並列で実行されます。

注意:

Oracle Big Data Connectors 3.0以降は、MapReduceのYet Another Resource Negotiator (YARN)実装をサポートしています。

1.2.2 Apache Hadoopとは

Apache Hadoopは、MapReduceプログラミング・モデルに基づく、データ処理ジョブの開発およびデプロイ用ソフトウェア・フレームワークです。中核機能として、Hadoopは、信頼できる共有ストレージおよび分析システム[1]を提供します。分析はMapReduceによって行われます。ストレージは、MapReduceジョブ向けに設計された共有ストレージ・システムであるHadoop Distributed File System (HDFS)によって行われます。

Hadoopエコシステムには、その他にApache Avro (Oracle Loader for Hadoopで使用されるデータ・シリアライズ・システム)などのプロジェクトが複数含まれています。

Cloudera's Distribution including Apache Hadoop (CDH)は、Oracle Big Data Applianceにインストールされます。この章の設定手順で説明されているように、CDHまたは同等のApache Hadoopコンポーネントが稼働するHadoopクラスタでOracle Big Data Connectorsを使用できます。

関連項目:

- Hadoopテクノロジに関する概念上の情報については、次のサードパーティの公開内容を参照してください。
『Hadoop: The Definitive Guide, Third Edition』Tom White著(O'Reilly Media Inc., 2012, ISBN: 978-1449311520)。

- Cloudera's Distribution including Apache Hadoop (CDH5)の詳細は、Oracle Clouderaの次のWebサイトを参照してください
http://oracle.cloudera.com/

- Apache Hadoopの詳細は、次のWebサイトを参照してください
http://hadoop.apache.org/

1.3 Oracle Big Data Connectorsソフトウェアのダウンロード

Oracle Big Data Connectorsは、Oracle Technology NetworkまたはOracle Software Delivery Cloudからダウンロードできます。Oracle Software Delivery Cloudには、Oracle Big Data Connectorsのメジャー・リリース用のダウンロードしかないことに注意してください。Oracle Technology Networkには、サポートされているリリースが用意されています。どちらのサイトも複数のブラウザに対応しています。

Oracle Technology Networkからダウンロードするには、次の手順を実行します。

1. 次にアクセスします
http://www.oracle.com/technetwork/bdc/big-data-connectors/downloads/index.html

2. 各コネクタの名前をクリックして、インストール・ファイルを含むzipファイルをダウンロードします。

Oracle Software Delivery Cloudからダウンロードするには、次の手順を実行します。

1. https://edelivery.oracle.com/に移動します

2. サインインして、Export Restrictionsを受諾します。

3. 製品名を製品フィールドに入力して、プラットフォームを選択します。

製品: Oracle Big Data Connectors

プラットフォーム: Linux x86-64

4. Oracle Big Data Connectorsが製品リストに表示されたら、続行をクリックします。Oracle Big Data Connectorsの最新メジャー・リリースが選択したオプションとして表示されます。

5. 別のリリースを選択するには、かわりのリリースを選択をクリックして、リストから別のパッケージを選択します。続行をクリックします。

6. 使用条件を読みます。受諾する場合はチェックボックスをクリックし、続行をクリックします。

7. ダウンロード・サイトで、zipファイルを個別に選択するか、すべてダウンロードをクリックします。

1.4 Oracle SQL Connector for Hadoop Distributed File Systemの設定

Oracle SQL Connector for Hadoop Distributed File System (HDFS)は、Oracle Databaseが稼働するシステムにインストールして構成します。Hive表がデータソースとして使用される場合、ユーザーがHiveにアクセスするHadoopクライアントにOracle SQL Connector for HDFSもインストールして実行する必要があります。

Oracle SQL Connector for HDFSは、Oracle Big Data Connectors用に構成されている場合には、Oracle Big Data Applianceにインストール済です。このインストールでサポートされるのは、Oracle Big Data Applianceに直接接続して各自のジョブを実行するユーザーです。

この項の内容は次のとおりです。

- ソフトウェア要件

- Oracle DatabaseシステムへのHadoopクライアントのインストールと構成

- Oracle SQL Connector for HDFSのインストール

- Oracle Databaseに対するユーザー・アクセス権の付与

- Oracle Databaseシステムへのユーザー・アカウントの設定

- セキュアなHadoopクラスタでのOracle SQL Connector for HDFSの使用

1.4.1 ソフトウェア要件

Oracle SQL Connector for HDFSには、次のソフトウェアが必要です。

Hadoopクラスタの場合:

- Cloudera's Distribution including Apache Hadoopバージョン5 (CDH5)、またはApache Hadoop 2.2.0から2.6.0。

- Java Development Kit (JDK)。推奨バージョンについては、Hadoopソフトウェアの代理店(ClouderaまたはApache)に確認してください。

- Hive 0.12.0、0.13.0、、0.13.1または1.1.0 (Hive表にアクセスする場合は必須、それ以外はオプション)

このソフトウェアは、Oracle Big Data Applianceにすでにインストールされています。

Oracle DatabaseシステムおよびHadoopクライアント・システムの場合:

- Oracle Database 12c (12.1.0.2)、Oracle Database 11gリリース2 (11.2.0.4以上) for Linux。

- Hadoopクラスタと同じバージョンのHadoop: CDH5、またはApache Hadoop 2.2.0から2.6.0。
Kerberosを使用してセキュアなHadoopクラスタを構成している場合は、データベース・システムのHadoopクライアントを、セキュアなクラスタにアクセスするように設定する必要があります。「セキュアなHadoopクラスタでのOracle SQL Connector for HDFSの使用」を参照してください。

- Hadoopクラスタと同じバージョンのJDK。

1.4.1.1 HadoopクライアントへのRのインストール

Oracle R Distributionの次のWebサイトからR 2.13.2をダウンロードして、インストール手順を入手できます。

http://oss.oracle.com/ORD/

終了したら、Linuxサーバーへの接続とRの実行に必要な権限がユーザーにあることを確認します。

また、Rユーザーによるアクセスが簡単になるようにRStudioサーバーもインストールできます。RStudioの次のWebサイトを参照してください。

http://rstudio.org/

1.4.2 Oracle DatabaseシステムへのHadoopクライアントのインストールと構成

Oracle SQL Connector for HDFSは、Oracle Databaseシステム上にHadoopクライアントを必要とします。Hadoopクライアントを使用する場合にかぎり、Hadoopのインストールを最小限に構成できます。Hadoopの完全なインストールは必要ありません。Oracle SQL Connector for HDFSで必要なHadoopの部分は、HadoopインストールからのHadoop JARファイルおよび構成ファイルのみです。

注意:
Oracle DatabaseシステムにHadoopが完全にインストールされている場合でも、決してこのシステムでHadoopを起動しないでください。Hadoopがローカルで実行されていると、Oracle SQL Connector for HDFSはHadoopクラスタではなく、そのHadoopへの接続を試行します。

Oracle Exadata Database Machineが含まれるOracle RACシステムの場合は、Oracleインスタンスを実行しているすべてのシステムで同一パスを使用して、Oracle SQL Connector for HDFSをインストールして構成する必要があります。

Oracle Big Data Applianceと併用するためのHadoopクライアントの追加

Oracle Big Data Applianceでは、システムでサポートされる独自の手順に従って、Hadoopクライアントをインストールする必要があります。HadoopシステムがOracle Big Data Applianceである場合は、『Oracle Big Data Applianceソフトウェア・ユーザーズ・ガイド』のCDHへのリモート・アクセスの提供に関する項を参照してください。この項では、CDHクライアントをインストールし、Kerberosで保護された環境または保護されていない環境で使用するために構成し、HDFSアクセスを検証する方法を説明します。

他のHadoopシステムと併用するためのHadoopクライアントの追加

Oracle Big Data Appliance以外のHadoopシステムに接続する場合は、代理店(ClouderaまたはApache)によって提供されるHadoopクライアントをダウンロードしてインストールします。たとえば、Oracle DatabaseシステムでCDHシステム(Oracle Big Data Applianceではないシステム)に接続できるHadoopクライアントが必要な場合は、次の手順を使用して適切なCDHクライアントをインストールし、Kerberosで保護された環境または保護されていない環境で使用するために構成して、Hadoopクラスタ上のHDFSへのアクセスを検証できます。

1. Oracle Databaseが稼働しているデータベース・システムにログインします。
このアカウントは、選択したインストール・パスへの書込み権限を持っている必要があります。通常は、管理ユーザー・アカウントで十分です。また、このアカウントはCloudera Managerへのログイン・アクセス権も持っている必要があります。

2. CDHファイルをインストールしてクライアントを構成します。

a. tarballをCloudera tarballのダウンロード・ページ(http://archive.cloudera.com/cdh5/cdh/5/)からダウンロードします

注意:
CDHクライアントのバージョンは、HadoopシステムのCDHバージョンと互換性がある必要があります。ファイル名のバージョン番号セグメント(hadoop-2.6.0-cdh5.4.7.tar.gzなど)が、Hadoopクラスタのバージョンと一致していることを確認してください。ダウンロード・ページで必要なtarballはこれだけです。

b. tarballをデータベース・システムの任意の永続パスにコピーして、tarballからファイルを抽出します。

$ tar xzf hadoop-<version>.tar.gz

c. HADOOP_PREFIX環境変数をこのパスに設定し、PATH変数にHADOOP_PREFIX/binを追加します。

$ export HADOOP_PREFIX=<install location>
$ export PATH=${HADOOP_PREFIX}/bin:${PATH}

d. Cloudera Managerで‘hdfs’サービスをクリックし、‘Download Client Configuration’アクションを選択して構成ファイルをダウンロードします。

e. クライアント構成ファイルをHADOOP_PREFIX/confに抽出します。

$mkdir ${HADOOP_PREFIX}/conf
unzip hdfs-clientconfig.zip -d /tmp
cp /tmp/hadoop-conf/* ${HADOOP_PREFIX}/conf

f. HADOOP_CONF_DIR環境変数を、クライアント構成ファイルをインストールしたパスに設定することもできます。(これはオプションです。)

export HADOOP_CONF_DIR=${HADOOP_PREFIX}/conf

3. JAVA_HOMEが、Hadoopインストールで必要とされるバージョンのJDKインストールを指していることを確認します。

4. クラスタがKerberosで保護されている場合は、Kerberos認証を許可するようにOracleシステムを構成します。(「セキュアなHadoopクラスタでのOracle SQL Connector for HDFSの使用」を参照してください。)

5. Oracle DatabaseシステムからHDFSへのアクセスをテストします。

a. Oracle Databaseアカウントを使用して、Oracle Databaseが稼働しているシステムにログオンします。

b. Bashシェルを開き、次のコマンドを入力します。

hdfs dfs -ls /user

Hadoopクラスタ上で直接コマンドを実行する場合と同じディレクトリ・リストが表示されます。表示されない場合、最初にHadoopクラスタが稼働していることを確認します。問題が続く場合、Oracle DatabaseからHadoopクラスタ・ファイル・システムにアクセスできるようにHadoopクライアント構成を修正する必要があります。

6. Oracle RACシステムの場合、各Oracle Databaseインスタンスに対してこの手順を繰り返します。

1.4.3 Oracle SQL Connector for HDFSのインストール

Oracle DatabaseシステムにOracle SQL Connector for HDFSをインストールするには、次の手順を実行します。

データベース・システム上のこの必須インストールの他に、互換Hadoopクライアントとして構成されたどのシステムにもOracle SQL Connector for HDFSをインストールできます。こうすることで、そのノードからOracle Database外部表を作成できるようになります。

Oracle DatabaseシステムにOracle SQL Connector for HDFSをインストールするには、次の手順を実行します。

1. Oracle Databaseが稼働するシステムのディレクトリにzipファイルをダウンロードします。

2. oraosch-version.zipの内容を解凍します。

$ unzip oraosch-3.4.0.zip
Archive:  oraosch-3.4.0.zip
extracting: orahdfs-3.4.0.zip
inflating: README.txt

3. orahdfs-version.zipを永続ディレクトリに解凍します。

$ unzip orahdfs-3.4.0.zip
unzip orahdfs-3.4.0.zip
Archive:  orahdfs-3.4.0.zip
creating: orahdfs-3.4.0/
creating: orahdfs-3.4.0/log/
creating: orahdfs-3.4.0/examples/
creating: orahdfs-3.4.0/examples/sql/
inflating: orahdfs-3.4.0/examples/sql/mkhive_unionall_view.sql
creating: orahdfs-3.4.0/doc/
inflating: orahdfs-3.4.0/doc/README.txt
creating: orahdfs-3.4.0/jlib/
inflating: orahdfs-3.4.0/jlib/osdt_cert.jar
inflating: orahdfs-3.4.0/jlib/oraclepki.jar
inflating: orahdfs-3.4.0/jlib/osdt_core.jar
inflating: orahdfs-3.4.0/jlib/ojdbc7.jar
inflating: orahdfs-3.4.0/jlib/orahdfs.jar
inflating: orahdfs-3.4.0/jlib/ora-hadoop-common.jar
creating: orahdfs-3.4.0/bin/
inflating: orahdfs-3.4.0/bin/hdfs_stream

解凍したファイルの構造は、例1-1のようになります。

4. orahdfs-3.4.0/bin/hdfs_stream Bashシェル・スクリプトをテキスト・エディタで開き、必要に応じて、スクリプトのコメントで示される変更を行います
hdfs_streamスクリプトには環境変数の設定は継承されないため、Oracle SQL Connector for HDFSで環境変数が必要な場合はこのスクリプトに設定します。

- PATH: hadoopスクリプトが/usr/bin:bin (hdfs_streamに初期設定されているパス)に存在しない場合、Hadoopのbinディレクトリ(/usr/lib/hadoop/binなど)を追加します。

- JAVA_HOME: HadoopによってJavaが検出されない場合、この変数をJavaのインストール・ディレクトリに設定します(/usr/bin/javaなど)。

各環境変数の詳細は、スクリプトのコメントを参照してください。

hdfs_streamスクリプトは、Oracle SQL Connector for HDFSで作成されたOracle Database外部表のプリプロセッサです。

5. Kerberosを使用してクラスタを保護している場合は、Kerberosチケットを取得します。

> kinit
> password

6. HDFSの/binディレクトリの場合は、Oracle SQL Connectorからhdfs_streamを実行します。次の使用方法の情報が表示されます。

$ ./hdfs_stream
Usage: hdfs_stream locationFile

使用方法の情報が表示されない場合、Oracle Databaseを実行しているオペレーティング・システム・ユーザー(oracleなど)に次の権限があることを確認します。

- hdfs_streamスクリプトに対する読取り権限と実行権限。

$ ls -l OSCH_HOME/bin/hdfs_stream
-rwxr-xr-x 1 oracle oinstall Nov 27 15:51 hdfs_stream

- orahdfs.jarに対する読取り権限。

$ ls -l OSCH_HOME/jlib/orahdfs.jar
-rwxr-xr-x 1 oracle oinstall Nov 27 15:51 orahdfs.jar

これらの権限が表示されない場合、chmodコマンドを入力して権限を修正します。たとえば、次のように入力します。

$ chmod 755 OSCH_HOME/bin/hdfs_stream

前述のコマンドでは、OSCH_HOMEは、Oracle SQL Connector for HDFSホーム・ディレクトリを表します。

7. Oracle RACシステムの場合、同じパスの場所を使用し、各Oracleインスタンスに対して前述の手順を繰り返します。

8. Oracle Databaseにログインし、hdfs_streamが格納されているorahdfs-version/binディレクトリのデータベース・ディレクトリを作成します。Oracle RACシステムの場合、このディレクトリにはすべてのOracleインスタンスが同一のパスを使用してアクセスできる必要があります。
次の例では、Oracle SQL Connector for HDFSは/etcにインストールされます。

SQL> CREATE OR REPLACE DIRECTORY osch_bin_path AS '/etc/orahdfs-3.4.0/bin';

9. Hive表へのアクセスをサポートするには、次の手順を実行します。

a. システムがHiveクライアントして構成されていることを確認します。

b. HiveのJARファイルとconfディレクトリをHADOOP_CLASSPATH環境変数に追加します。各種のHadoop製品間でJARが競合しないようにするため、HADOOP_CLASSPATHは、グローバルに変更するのではなく、ローカル・シェル初期化スクリプトに設定することをお薦めします。複数のJARファイル・パスがHADOOP_CLASSPATHにある場合は、現在の製品のJARを最初にリストしてください。

解凍したファイルの構造は、例1-1のようになります。

図1-1に、データの流れとコンポーネントの場所を示します。

図1-1 HDFSおよびデータ・ポンプ・ファイルをサポートするOracle SQL Connector for HDFSのインストール

例1-1 orahdfsディレクトリの構造

orahdfs-version
bin/
hdfs_stream
doc/
README.txt
examples/
sql/
mkhive_unionall_view.sql
jlib/
ojdbc6.jar
ora-hadoop-common.jar
oraclepki.jar
orahdfs.jar
osdt_cert.jar
osdt_core.jar
log/

1.4.4 Oracle Databaseに対するユーザー・アクセス権の付与

Oracle DatabaseユーザーがOracle SQL Connector for HDFSを使用して外部表を作成するには、次の権限が必要です。

- CREATE SESSION

- CREATE TABLE

- CREATE VIEW

- UTL_FILE PL/SQLパッケージに対するEXECUTE

- Oracle SQL Connector for HDFSのインストール時に作成されるOSCH_BIN_PATHディレクトリに対するREADおよびEXECUTE。書込みアクセス権は誰にも付与しないでください。Oracle SQL Connector for HDFSを使用する予定のユーザーにのみEXECUTEを付与します。

- 外部表を格納するデータベース・ディレクトリに対するREADとWRITE、またはCREATE ANY DIRECTORYシステム権限。Oracle RACシステムの場合、このディレクトリは、すべてのOracleインスタンスでアクセスできる共有ディスク上に存在する必要があります。

- データをOracleデータベースにコピーする表領域と割当て。オプション。

例1-2に、これらの権限をHDFSUSERに付与するSQLコマンドを示します。

注意:

Oracle SQL Connector for HDFSを使用する外部表を問い合せる場合にユーザーに必要な権限は、対象の表に対するSELECT権限のみです。

例1-2 Oracle SQL Connector for HDFSに対するユーザー・アクセス権の付与

CONNECT / AS sysdba;
CREATE USER hdfsuser IDENTIFIED BY password
DEFAULT TABLESPACE hdfsdata
QUOTA UNLIMITED ON hdfsdata;
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO hdfsuser;
GRANT EXECUTE ON sys.utl_file TO hdfsuser;
GRANT READ, EXECUTE ON DIRECTORY osch_bin_path TO hdfsuser;
GRANT READ, WRITE ON DIRECTORY external_table_dir TO hdfsuser;

1.4.5 Oracle Databaseシステムへのユーザー・アカウントの設定

HDFSおよびデータ・ポンプ形式ファイルの外部表を作成する場合、ユーザーは、Oracle DatabaseシステムまたはHadoopクライアントとして設定された別のシステムにログインできます。

これらのシステムのアカウントは、他のオペレーティング・システム・ユーザーの場合と同様に設定できます。HADOOP_CLASSPATHにpath/orahdfs-3.4.0/jlib/*を含める必要があります。この設定は、このインストール手順の一部としてシェルのプロファイルに追加することも、ユーザーが設定することもできます。次の例では、BashシェルのHADOOP_CLASSPATHを変更します。ここでは、Oracle SQL Connector for HDFSは/usr/binにインストールされています。

export HADOOP_CLASSPATH="/etc/orahdfs-3.4.0/jlib/*:$HADOOP_CLASSPATH"

1.4.6 セキュアなHadoopクラスタでのOracle SQL Connector for HDFSの使用

ユーザーが、Oracle SQL Connector for HDFSを使用して作成された外部表にアクセスする場合、外部表は、Oracleデータベースが稼働しているシステムで実行されているHadoopクライアントのように動作します。また、Oracleのインストール先のオペレーティング・システム・ユーザーのIDが使用されます。

セキュアなHadoopクラスタでは、Kerberosがインストール済で、クライアント・アクティビティを認証するように構成されています。Oracle SQL Connector for HDFSをKerberosで保護されたHadoopクラスタとともに使用するように構成する必要があります。

kinitを使用してユーザーを認証する場合:

- Hadoop管理者は、クラスタに対するKey Distribution Center (KDC)にオペレーティング・システム・ユーザー(oracleなど)およびパスワードを登録する必要があります。

- Oracle Databaseシステムのシステム管理者は、/etc/krb5.confを構成して、セキュアなクラスタによって管理されているKDCを参照するドメイン定義を追加します。

これらの手順を使用すると、オペレーティング・システム・ユーザーは、kinitユーティリティで認証されてから、Oracle SQL Connector for HDFSジョブを発行できます。kinitユーティリティは通常、認証用のKerberosキータブ・ファイルを使用し、パスワードに対話型プロンプトを使用しません。

システムではkinitをKerberosチケットの失効前に定期的に実行して、Oracle SQL Connector for HDFSによる透過的な認証を可能にする必要があります。cronまたは類似ユーティリティを使用して、kinitを実行します。たとえば、Kerberosチケットが2週間ごとに期限が切れる場合は、チケットの期限を1週間ごとに延長するようにcronジョブを設定します。

Oracle SQL Connector for HDFSがアクティブに使用されなくなったら実行されるように、cronジョブがスケジュールされていることを確認してください。

Oracle SQL Connector for HDFSプリプロセッサ・スクリプト(hdfs_stream)内のkinitは、kinitに対する大量の同時呼出しがトリガーされて、内部Kerberosキャッシュ・エラーが作成される可能性があるため、呼び出さないでください。

注意:

Oracle Big Data Applianceでは、Kerberosセキュリティが構成オプションとして自動的に構成されます。セキュアなOracle Big Data Applianceクラスタに対するクライアント・システムの設定の詳細は、『Oracle Big Data Applianceソフトウェア・ユーザーズ・ガイド』を参照してください。

1.5 Oracle Loader for Hadoopの設定

Oracle Loader for Hadoopを設定するには、次の各項の手順に従います。

- ソフトウェア要件

- Oracle Loader for Hadoopのインストール

- オフライン・データベース・モードのサポート

- セキュアなHadoopクラスタでのOracle Loader for Hadoopの使用

1.5.1 ソフトウェア要件

Oracle Loader for Hadoopには、次のソフトウェアが必要です。

- 次のいずれかが稼働しているターゲット・データベース・システム

- Oracle Database 12c (12.1.0.2)

- Oracle Database 11gリリース2 (11.2.0.4)

- Cloudera's Distribution including Apache Hadoopバージョン5 (CDH5)、またはApache Hadoop 2.2.0から2.6.0。

- Hive表からデータをロードする場合はApache Hive 0.12.0、0.13.0、0.13.1または1.1.0。

1.5.2 Oracle Loader for Hadoopのインストール

Oracle Loader for Hadoopは、Oracle Database 12c (12.1.0.2)クライアント・ライブラリ、およびOracle Database 11.2.0.4または12.1.0.2に接続するためのOracle Instant Clientライブラリに同梱されています。

注意:

Oracle Loader for Hadoopをインストールするシステムには、Oracle Clientが必要とするリソースと同じリソースが必要です。Oracle Database 12c リリース1 (12.1)におけるOracle Clientの要件に関する詳細は、Oracle Database Clientインストレーション・ガイドを参照してください。

Oracle Loader for Hadoopをインストールするには、次の手順を実行します。

1. oraloader-version.x86_64.zipの内容をHadoopクラスタまたはHadoopクライアントとして構成したシステムのディレクトリに解凍します。

2. oraloader-version-h2.x86_64.zipをHadoopクラスタのディレクトリに解凍します。

oraloader-version-h2というディレクトリが次のサブディレクトリとともに作成されます。

doc
jlib
lib
examples

3. OLH_HOMEという変数を作成し、その変数をインストール・ディレクトリに設定します。

4. HADOOP_CLASSPATH変数に次のパスを追加します。

- すべてインストールする場合:

$OLH_HOME/jlib/*

OLHを使用するとき、$OLH_HOME/jlib/*は常にHADOOP_CLASSPATHに最初に指定する必要があります。

- Hive表からのデータのロードをサポートする場合:

/usr/lib/hive/lib/*
/etc/hive/conf

「oracle.hadoop.xquery.lib.share」を参照してください。

- Oracle NoSQL Databaseリリース2からデータを読み取る場合:

$KVHOME/lib/kvstore.jar

1.5.3 オフライン・データベース・モードのサポート

一般的なインストールでは、Oracle Loader for HadoopはHadoopクラスタまたはHadoopクライアントからOracle Databaseシステムに接続できます。接続できない場合(複数のシステムが異なるネットワーク上にある場合など)は、Oracle Loader for Hadoopをオフライン・データベース・モードで使用できます。「操作モードの概要」を参照してください。

オフライン・データベース・モードをサポートするには、2つのシステムにOracle Loader for Hadoopをインストールする必要があります。

- HadoopクラスタまたはHadoopクライアントとして設定されているシステム(「Oracle Loader for Hadoopのインストール」を参照)。

- Oracle DatabaseシステムまたはOracle Databaseへのネットワーク・アクセスを備えたシステム(次の手順を参照)。

Oracle Loader for Hadoopをオフライン・データベース・モードでサポートするには、次の手順を実行します。

1. oraloader-version.zipの内容をOracle DatabaseシステムまたはOracle Databaseへのネットワーク・アクセスを備えたシステムに解凍します。Hadoopクラスタにインストールしたものと同じバージョンのソフトウェアを使用する必要があります。

2. oraloader-version-h2.x86_64.zipを解凍します。

3. OLH_HOMEという変数を作成し、その変数をインストール・ディレクトリに設定します。次の例では、Bashシェル構文を使用しています。

$ export OLH_HOME="/usr/bin/oraloader-version-h2/"

4. Oracle Loader for HadoopのJARファイルをHADOOP_CLASSPATH環境変数に追加します。他のJARファイル・パスがHADOOP_CLASSPATHにある場合、Oracle Loader for Hadoopを使用するときにはOracle Loader for HadoopのJARファイル・パスを最初に指定してください。次の例では、Bashシェル構文を使用しています。

$ export HADOOP_CLASSPATH=$OLH_HOME/jlib/*:$HADOOP_CLASSPATH

1.5.4 セキュアなHadoopクラスタでのOracle Loader for Hadoopの使用

セキュアなHadoopクラスタでは、Kerberosがインストール済で、クライアント・アクティビティを認証するように構成されています。オペレーティング・システム・ユーザーは認証されてから、Oracle Loader for Hadoopジョブを開始してセキュアなHadoopクラスタで実行する必要があります。認証の場合、ユーザーは、ジョブを発行するオペレーティング・システムにログインして、標準のKerberosのkinitユーティリティを使用する必要があります。

kinitを使用してユーザーを認証する場合:

- Hadoop管理者は、クラスタに対するKey Distribution Center (KDC)にオペレーティング・システム・ユーザーおよびパスワードを登録する必要があります。

- オペレーティング・システム・ユーザーがOracle Loader for Hadoopジョブを開始するクライアント・システムのシステム管理者は、/etc/krb5.confを構成して、セキュアなクラスタによって管理されているKDCを参照するドメイン定義を追加する必要があります。

通常、kinitユーティリティでは、数日間有効の認証チケットを取得します。後続のOracle Loader for Hadoopジョブは、失効していないチケットを使用して透過的に認証されます。

注意:

Oracle Big Data Applianceでは、Kerberosセキュリティが構成オプションとして自動的に構成されます。セキュアなOracle Big Data Applianceクラスタに対するクライアント・システムの設定の詳細は、『Oracle Big Data Applianceソフトウェア・ユーザーズ・ガイド』を参照してください。

1.6 Oracle XQuery for Hadoopの設定

Oracle XQuery for HadoopをHadoopクラスタにインストールして構成します。Oracle Big Data Applianceを使用している場合、このソフトウェアはすでにインストールされています。

次のトピックでは、このソフトウェアのインストールについて説明します。

- ソフトウェア要件

- Oracle XQuery for Hadoopのインストール

- ファイル・パスのトラブルシューティング

- Oracle XQuery for HadoopアクションのOozieの構成

1.6.1 ソフトウェア要件

Oracle Big Data Appliance 4.3は、次のソフトウェア要件を満たしています。ただし、サードパーティのクラスタにOracle XQuery for Hadoopをインストールしている場合は、これらのコンポーネントがインストールされていることを確認する必要があります。

- Java 7.xまたは6.x

- Cloudera's Distribution including Apache Hadoopバージョン4.1.2以降(CDH 5.xを含みます)

- Oracle NoSQL Databaseに対する読取りおよび書込みをサポートするOracle NoSQL Database 3.xまたは2.x

- Oracleデータベースへの表の書込みをサポートするOracle Loader for Hadoop 3.5.0

1.6.2 Oracle XQuery for Hadoopのインストール

次の手順に従って、Oracle XQuery for Hadoopをインストールします。

Oracle XQuery for Hadoopをインストールするには、次の手順を実行します。

1. oxh-version.zipの内容をインストール・ディレクトリに解凍します。

$ unzip oxh-4.2.0-cdh-5.0.0.zip
Archive:  oxh-4.2.0-cdh-5.0.0.zip
creating: oxh-4.2.0-cdh5.0.0/
creating: oxh-4.2.0-cdh5.0.0/lib/
creating: oxh-4.2.0-cdh5.0.0/oozie/
creating: oxh-4.2.0-cdh5.0.0/oozie/lib/
inflating: oxh-4.2.0-cdh5.0.0/lib/ant-launcher.jar
inflating: oxh-4.2.0-cdh5.0.0/lib/ant.jar
.
.
.

これで、Oracle XQuery for Hadoopを実行できます。

2. 実行時間を最速にするには、ライブラリをHadoop分散キャッシュにコピーします。

a. Oracle XQuery for HadoopおよびサードパーティのすべてのライブラリをHDFSディレクトリにコピーします。ファイルのコピーに-exportliboozieオプションを使用する場合は、「Oracle XQuery for Hadoopのオプション」を参照してください。あるいは、HDFSコマンドライン・インタフェースを使用してライブラリを手動でコピーすることもできます。
Oozieを使用する場合は、すべてのファイルで同じフォルダを使用します。「Oracle XQuery for HadoopアクションのOozieの構成」を参照してください

b. oracle.hadoop.xquery.lib.shareプロパティを設定するか、コマンドラインで-sharelibオプションを使用して、Hadoop分散キャッシュのディレクトリを指定します。

3. Oracle Databaseへのデータのロードをサポートするには、次のようにOracle Loader for Hadoopをインストールします。

a. oraloader-version.x86_64.zipの内容をHadoopクラスタまたはHadoopクライアントとして構成したシステムのディレクトリに解凍します。このアーカイブには、アーカイブとREADMEファイルが含まれています。

b. Hadoopクラスタのディレクトリにアーカイブを解凍します。

unzip oraloader-version-h2.x86_64.zip

oraloader-version-h2というディレクトリが次のサブディレクトリとともに作成されます。

doc
jlib
lib
examples

c. OLH_HOMEという環境変数を作成して、インストール・ディレクトリに設定します。HADOOP_CLASSPATHは設定しないでください。

4. Oracle NoSQL Databaseへのデータのロードをサポートするには、インストール後、KVHOMEという環境変数をOracle NoSQL Databaseのインストール・ディレクトリに設定します。

注意:

NoSQL Database jarファイルをHADOOP_CLASSPATHに追加しないでください。

5. Apache Solrによる索引をサポートするには、次のようにします。

a. HadoopクラスタにSolrがインストールされ、構成されていることを確認します。SolrはCloudera Searchに含まれており、Oracle Big Data Appliance上に自動的にインストールされます。

b. ドキュメントのロード先となるインストールしたSolrにコレクションを作成します。コレクションを作成するにはsolrctlユーティリティを使用します。

関連項目:

solrctlユーティリティに関しては、次のサイトのCloudera Searchユーザー・ガイドを参照してください。

http://www.cloudera.com/content/cloudera-content/cloudera-docs/Search/latest/Cloudera-Search-User-Guide/csug_solrctl_ref.html

c. OXH_SOLR_MR_HOME環境変数をsearch-mr-version.jarおよびsearch-mr-version-job.jarを含むローカル・ディレクトリに設定し、インストールしたSolrを使用するようにOracle XQuery for Hadoopを構成します。次に例を示します。

$ export OXH_SOLR_MR_HOME="/usr/lib/solr/contrib/mr"

注意:

また、Apache Tikaアダプタを使用する前に、Oracle XQuery for Hadoopを構成し、OXH_SOLR_MR_HOME環境変数をローカル・ディレクトリに設定してください。

1.6.3 ファイル・パスのトラブルシューティング

Oracle XQuery for Hadoopで問合せの実行時に独自のライブラリまたはサードパーティのライブラリの検出に失敗した場合は、「Oracle XQuery for Hadoopのインストール」で説明されているように、環境変数が設定されていることを最初に確認してください。

注意:

HADOOP_CLASSPATH環境変数または-libjarsコマンドライン・オプションには、OXHライブラリまたはサードパーティ・ライブラリは含まれません。

正しく設定されている場合は、lib/oxh-lib.xmlの編集が必要な可能性があります。このファイルは、Oracle XQuery for HadoopシステムのJARファイルと、Avro、Oracle Loader for HadoopやOracle NoSQL Databaseなどのその他のライブラリの場所を識別します。

必要に応じて、このファイルの環境変数は、${env.variable} (${env.OLH_HOME}など)で参照できます。Hadoopプロパティも${property}(${mapred.output.dir}など)で参照できます。

1.6.4 Oracle XQuery for HadoopアクションのOozieの構成

「Apache Oozieからの問合せの実行」で説明しているように、Apache Oozieワークフローを使用して問合せを実行できます。ソフトウェアは、Oracle Big Data Applianceにすでにインストールおよび構成されています。

その他のHadoopクラスタの場合は、まずOracle XQuery for Hadoopアクションを使用するようにOozieを構成する必要があります。これらは、Oracle XQuery for Hadoopアクションをインストールする一般的な手順です。

1. Oozie構成を変更します。CDHをサードパーティ・ハードウェアで実行する場合、Cloudera Managerを使用してOozieサーバー構成を変更します。それ以外のHadoopのインストールの場合は、oozie-site.htmを編集します。

- oracle.hadoop.xquery.oozie.OXHActionExecutorをoozie.service.ActionService.executor.ext.classesプロパティの値に追加します。

- oxh-action-v1.xsdをoozie.service.SchemaService.wf.ext.schemasプロパティの値に追加します。

2. oxh-oozie.jarをOozieサーバーのクラス・パスに追加します。たとえば、CDH5のインストールではoxh-oozie.jarをサーバーの/var/lib/oozieにコピーします。

3. Oracle XQuery for Hadoopのすべての依存関係を、oxhサブディレクトリのOozie共有ライブラリに追加します。CLI -exportliboozieオプションを使用できます。「Oracle XQuery for Hadoopのオプション」を参照してください。

4. 変更を反映するためにOozieを再起動します。

具体的な手順は、Oozieがすでにインストールされているか、どのバージョンを使用しているかなどOozieのインストールによって決まります。

1.7 Oracle R Advanced Analytics for Hadoopの設定

Oracle R Advanced Analytics for Hadoopでは、Hadoop側とクライアントLinuxシステムへのソフトウェア環境のインストールが必要です。次のトピックでは、インストールについて説明します。

- Hadoopへのソフトウェアのインストール

- 追加のRパッケージのインストール

- Rユーザーへのリモート・クライアント・アクセスの提供

関連項目:

Oracle R Advanced Analytics for Hadoopリリース・ノートは次のサイトを参照してください。

http://www.oracle.com/technetwork/database/database-technologies/bdc/r-advanalytics-for-hadoop/documentation/index.html

1.7.1 Hadoopへのソフトウェアのインストール

Oracle Big Data Applianceでは、追加ソフトウェアのインストールや構成なしにOracle R Advanced Analytics for Hadoopがサポートされます。ただし、サードパーティのHadoopクラスタでOracle R Advanced Analytics for Hadoopを使用するには、必要な環境を作成する必要があります。

1.7.1.1 サードパーティHadoopクラスタのソフトウェア要件

Oracle R Advanced Analytics for HadoopをサポートするサードパーティHadoopクラスタにいくつかのソフトウェア・コンポーネントをインストールする必要があります。

次のコンポーネントをサードパーティ・サーバーにインストールします。

- Cloudera's Distribution including Apache Hadoopバージョン4 (CDH5)またはApache Hadoop 0.20.2+923.479以上。
代理店で提供される手順を完了します。

- Apache Hive 0.10.0+67以上
「サードパーティHadoopクラスタへのHiveのインストール」を参照してください。

- Oracle Databaseに接続する関数を実行するためのSqoop 1.3.0+5.95以上。Oracle R Advanced Analytics for Hadoopでは、Sqoopをインストールまたはロードする必要はありません。
「サードパーティHadoopクラスタへのSqoopのインストール」を参照してください。

- Mahout (orch_lmf_mahout_als.Rを実行する場合)。

- Java Virtual Machine (JVM)、できればJava HotSpot Virtual Machine 6。
次のダウンロード・サイトで提供される手順を完了します。

http://www.oracle.com/technetwork/java/javase/downloads/index.html

- HadoopクラスタのすべてのノードにOracle R Distribution 3.0.1とすべてのベース・ライブラリ。
「サードパーティHadoopクラスタへのRのインストール」を参照してください。

- 各RエンジンのORCHパッケージ。Hadoopクラスタの各ノードに必要です。
「サードパーティHadoopクラスタへのORCHパッケージのインストール」を参照してください。

- OLHドライバ(オプション)をサポートするOracle Loader for Hadoop。
「Oracle Loader for Hadoopの設定」を参照してください。

注意:

HadoopクラスタにHADOOP_HOMEを設定しないでください。CDH5はその設定を必要とせず、設定するとOracle R Advanced Analytics for Hadoopに支障をきたします。他のアプリケーションでHADOOP_HOMEを設定する必要がある場合は、/etc/bashrcファイルにHADOOP_LIBEXEC_DIRも設定してください。次に例を示します。

export HADOOP_LIBEXEC_DIR=/usr/lib/hadoop/libexec

1.7.1.2 サードパーティHadoopクラスタへのSqoopのインストール

Sqoopには、Hadoopに対するSQLライクなインタフェースがあり、これはJavaベース環境になります。Oracle R Advanced Analytics for Hadoopでは、Oracle DatabaseへのアクセスにSqoopを使用します。

注意:

Oracle DatabaseへのデータのロードにOracle Loader for Hadoopをドライバとして使用する場合もSqoopが必要です。Sqoopは、データベースからHDFSへのデータのコピーや自由形式の問合せのデータベースへの送信などの関数を実行します。このドライバでは、Oracle Loader for Hadoopがサポートしない操作の実行にもSqoopが使用されます。

Oracle Databaseで使用するためにSqoopをインストールして構成するには、次の手順を実行します。

1. Sqoopがサーバーにインストールされていない場合はインストールします。

Cloudera's Distribution including Apache Hadoopについては、次のサイトの『CDH Installation Guide』のSqoopインストール手順を参照してください

http://oracle.cloudera.com/

2. Oracle Databaseに適したJava Database Connectivity (JDBC)ドライバを次のOracle Technology Networkからダウンロードします

http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html

3. ドライバのJARファイルを$SQOOP_HOME/libにコピーします。これは、/usr/lib/sqoop/libなどのディレクトリです。

4. SqoopにOracle Databaseへの接続文字列を指定します。

$ sqoop import --connect jdbc_connection_string

sqoop import --connect jdbc:oracle:thin@myhost:1521/orclのようになります。

1.7.1.3 サードパーティHadoopクラスタへのHiveのインストール

Hiveは、HiveQLと呼ばれる問合せ言語によって、代替のストレージおよび取得メカニズムをHDFSファイルに提供します。Oracle R Advanced Analytics for HadoopではHiveQLのデータ準備と分析機能が使用されますが、R言語構文も使用できます。

Hiveをインストールするには、次の手順を実行します。

1. 代理店(ClouderaまたはApache)で提供されるHiveインストール手順に従います。

2. インストールが適切に機能することを確認します。

3. $ hive -H 使用方法: hive -d,--define <key=value> hiveコマンドに適用する変数の代入。例: -d A=Bまたは--define A=B . . .

4. コマンドが失敗したり、出力に警告が表示される場合、Hiveインストールを修正します。

1.7.1.4 サードパーティHadoopクラスタへのRのインストール

次のWebサイトからOracle R Distribution 3.0.1をダウンロードして、インストール手順を入手できます。

http://www.oracle.com/technetwork/database/database-technologies/r/r-distribution/downloads/index.html

1.7.1.5 サードパーティHadoopクラスタへのORCHパッケージのインストール

ORCHは、Oracle R Advanced Analytics for Hadoopパッケージの名前です。

ORCHパッケージをインストールするには、次の手順を実行します。

1. クラスタの第1ノードにrootとしてログインします。

2. サポートするソフトウェアの環境変数を設定します。

$ export JAVA_HOME="/usr/lib/jdk7"
$ export R_HOME="/usr/lib64/R"
$ export SQOOP_HOME "/usr/lib/sqoop"

3. ダウンロードしたファイルを解凍します。

$ unzip orch-version.zip
$ unzip orch-linux-x86_64-2.4.0.zip
Archive:  orch-linux-x86_64-2.4.0.zip
creating: ORCH2.4.0/
extracting: ORCH2.4.0/ORCH_2.4.0_R_x86_64-unknown-linux-gnu.tar.gz
inflating: ORCH2.4.0/ORCHcore_2.4.0_R_x86_64-unknown-linux-gnu.tar.gz
.
.
.

4. 新しいディレクトリに変更します。

$ cd ORCH2.4.0

5. 次の順序でパッケージをインストールします。

R --vanilla CMD INSTALL OREbase_1.4_R_x86_64-unknown-linux-gnu.tar.gz
R --vanilla CMD INSTALL OREstats_1.4_R_x86_64-unknown-linux-gnu.tar.gz
R --vanilla CMD INSTALL OREmodels_1.4_R_x86_64-unknown-linux-gnu.tar.gz
R --vanilla CMD INSTALL OREserver_1.4_R_x86_64-unknown-linux-gnu.tar.gz
R --vanilla CMD INSTALL ORCHcore_2.4.0_R_x86_64-unknown-linux-gnu.tar.gz
R --vanilla CMD INSTALL ORCHstats_2.4.0_R_x86_64-unknown-linux-gnu.tar.gz
R --vanilla CMD INSTALL ORCH_2.4.0_R_x86_64-unknown-linux-gnu.tar.gz

6. 次のパッケージは、クラスタのその他すべてのノードにもインストールする必要があります。

- OREbase

- OREmodels

- OREserver

- OREstats

次の例では、dcliユーティリティ(Oracle Big Data Applianceでは使用可能で、サードパーティ・クラスタでは使用不可)を使用して、OREserverパッケージをコピーおよびインストールします。

$ dcli -C -f OREserver_1.4_R_x86_64-unknown-linux-gnu.tar.gz -d /tmp/ OREserver_1.4_R_x86_64-unknown-linux-gnu.tar.gz

$ dcli -C " R --vanilla CMD INSTALL /tmp/OREserver_1.4_R_x86_64-unknown-linux-gnu.tar.gz"

1.7.2 追加のRパッケージのインストール

Hadoopクラスタでは、すべてのノードにlibpng-develがインストールされている必要があります。コモディティ・ハードウェア上で稼働するクラスタを使用する場合も基本手順は同じです。ただし、dcliユーティリティを使用してコマンドをすべてのノード間に複製することはできません。dcliユーティリティの構文は、『Oracle Big Data Applianceオーナーズ・ガイド』を参照してください。

libpng-develをインストールするには、次の手順を実行します。

1. Hadoopクラスタの任意のノードにrootとしてログインします。

2. libpng-develがすでにインストールされているかどうかを確認します。

# dcli rpm -qi libpng-devel
bda1node01: package libpng-devel is not installed
bda1node02: package libpng-devel is not installed
.
.
.

すべてのサーバーにパッケージがインストール済の場合、この手順は省略できます。

3. ファイアウォールの外側にプロキシ・サーバー経由で接続する必要がある場合は、HTTP_PROXY環境変数を設定します。この例では、dcliを使用します。これは、Oracle Big Data Applianceでのみ使用可能です。

# dcli export HTTP_PROXY="http://proxy.example.com"

4. yumディレクトリに移動します。

# cd /etc/yum.repos.d

5. 使用するLinuxのバージョンに適した構成ファイルをダウンロードして構成します。
Enterprise Linux 5 (EL5)の場合:

a. yum構成ファイルをダウンロードします。

# wget http://public-yum.oracle.com/public-yum-el5.repo

b. テキスト・エディタでpublic-yum-el5.repoを開き、次のように変更します。
el5_latestの下で、enabled=1と設定します。

el5_addonsの下で、enabled=1と設定します。

c. 変更を保存し、終了します。

d. 他のOracle Big Data Applianceサーバーにファイルをコピーします。

# dcli -d /etc/yum.repos.d -f public-yum-el5.repo

Oracle Linux 6 (OL6)の場合:

a. yum構成ファイルをダウンロードします。

# wget http://public-yum.oracle.com/public-yum-ol6.repo

b. テキスト・エディタでpublic-yum-ol6.repoを開き、次のように変更します。
ol6_latestの下で、enabled=1と設定します。

ol6_addonsの下で、enabled=1と設定します。

c. 変更を保存し、終了します。

d. 他のOracle Big Data Applianceサーバーにファイルをコピーします。

# dcli -d /etc/yum.repos.d -f public-yum-ol6.repo

6. すべてのサーバーにパッケージをインストールします。

# dcli yum -y install libpng-devel
bda1node01: Loaded plugins: rhnplugin, security
bda1node01: Repository 'bda' is missing name in configuration, using id
bda1node01: This system is not registered with ULN.
bda1node01: ULN support will be disabled.
bda1node01: http://bda1node01-master.abcd.com/bda/repodata/repomd.xml:
bda1node01: [Errno 14] HTTP Error 502: notresolvable
bda1node01: Trying other mirror.
.
.
.
bda1node01: Running Transaction
bda1node01: Installing     : libpng-devel                    1/2
bda1node01: Installing     : libpng-devel                    2/2

bda1node01: Installed:
bda1node01: libpng-devel.i386 2:1.2.10-17.el5_8  ibpng-devel.x86_64 2:1.2.10-17.el5_8

bda1node01: Complete!
bda1node02: Loaded plugins: rhnplugin, security
.
.
.

7. すべてのサーバーでインストールが正常に終了したことを確認します。

# dcli rpm -qi libpng-devel
bda1node01: Name        : libpng-devel Relocations: (not relocatable)
bda1node01: Version     : 1.2.10       Vendor: Oracle America
bda1node01: Release     : 17.el5_8      Build Date: Wed 25 Apr 2012 06:51:15 AM PDT
bda1node01: Install Date: Tue 05 Feb 2013 11:41:14 AM PST  Build Host: ca-build56.abcd.com
bda1node01: Group       : Development/Libraries  Source RPM: libpng-1.2.10-17.el5_8.src.rpm
bda1node01: Size        : 482483                 License: zlib
bda1node01: Signature   : DSA/SHA1, Wed 25 Apr 2012 06:51:41 AM PDT, Key ID 66ced3de1e5e0159
bda1node01: URL         : http://www.libpng.org/pub/png/
bda1node01: Summary     : Development tools for programs to manipulate PNG image format files.
bda1node01: Description :
bda1node01: The libpng-devel package contains the header files and static
bda1node01: libraries necessary for developing programs using the PNG (Portable
bda1node01: Network Graphics) library.
.
.
.

1.7.3 Rユーザーへのリモート・クライアント・アクセスの提供

Rユーザーは、Hadoopクラスタで自身のプログラムをMapReduceジョブとして実行しますが、通常、そのプラットフォームでの個別アカウントは保有していません。かわりに、外部Linuxサーバーでリモート・アクセスが提供されます。

1.7.3.1 リモート・クライアント・アクセスのソフトウェア要件

HadoopクラスタへのアクセスをRユーザーに提供するには、次のコンポーネントをLinuxサーバーにインストールします。

- Hadoopクラスタと同じバージョンのHadoop。インストールされていない場合、予想外の問題や障害が生じることがあります。

- Hadoopクラスタと同じバージョンのSqoop。Oracle Database内外でのデータのコピーをサポートする場合にのみ必要です。

- Mahout。Mahout ALS-WSアルゴリズムでorch.ls関数を使用する場合にのみ必要です。

- Hadoopクラスタと同じバージョンのJava Development Kit (JDK)。

- Oracle Rディストリビューション3.0.1とすべてのベース・ライブラリ。

- ORCH Rパッケージ。

データベース・オブジェクトにアクセスできるようにするには、Oracle DatabaseへのOracle Advanced Analyticsオプションが必要です。その後、Hadoopクライアントにこの追加コンポーネントをインストールできます。

- Oracle R Enterpriseクライアントのパッケージ。

1.7.3.2 Hadoopクライアントとしてのサーバーの構成

クライアントにHadoopをインストールし、HDFSクライアントを使用する場合はHadoopの最小限の構成を行う必要があります。

クライアント・システムにHadoopをインストールして構成するには、次の手順を実行します。

1. クライアント・システムにCDH5またはApache Hadoop 0.20.2をインストールして構成します。このシステムがOracle Databaseのホストになります。Oracle Big Data Applianceを使用する場合、『Oracle Big Data Applianceソフトウェア・ユーザーズ・ガイド』のリモート・クライアント・アクセスを提供するための手順を完了します。それ以外の場合は、代理店(ClouderaまたはApache)が提供するインストール手順に従います。

2. Rユーザーでクライアント・システムにログインします。

3. Bashシェルを開き、次のHadoopファイル・システム・コマンドを入力します。

$HADOOP_HOME/bin/hdfs dfs -ls /user

4. ファイルのリストが表示されたら終了です。表示されない場合、Hadoopクラスタが稼働していることを確認します。それでも問題が修正されない場合は、クライアントHadoopのインストールをデバッグする必要があります。

1.7.3.3 HadoopクライアントへのSqoopのインストール

Sqoopをインストールして構成する場合、「サードパーティHadoopクラスタへのSqoopのインストール」で説明する手順と同じ手順をクライアント・システムで完了します。

1.7.3.4 HadoopクライアントへのRのインストール

Oracle R Distributionの次のWebサイトからR 2.13.2をダウンロードして、インストール手順を入手できます。

http://oss.oracle.com/ORD/

終了したら、Linuxサーバーへの接続とRの実行に必要な権限がユーザーにあることを確認します。

また、Rユーザーによるアクセスが簡単になるようにRStudioサーバーもインストールできます。RStudioの次のWebサイトを参照してください。

http://rstudio.org/

1.7.3.5 HadoopクライアントへのORCHパッケージのインストール

ORCHをHadoopクライアント・システムにインストールするには、次の手順を実行します。

1. ORCHパッケージをダウンロードし、クライアント・システムに解凍します。

2. インストール・ディレクトリに移動します。

3. 次のようにクライアント・スクリプトを実行します。

# ./install-client.sh

1.7.3.6 Oracle R Enterpriseクライアントのパッケージ(オプション)のインストール

Rを使用したOracle Databaseへの完全なアクセスをサポートするには、Oracle R Enterpriseリリース1.4のクライアントのパッケージをインストールします。このパッケージがない場合、Oracle R Advanced Analytics for Hadoopでは、Oracle R Enterpriseで提供される高度な統計アルゴリズムを利用できません。

関連項目:

RおよびOracle R Enterpriseのインストールの詳細は、Oracle R Enterpriseユーザーズ・ガイド

1.8 Oracle Data Integrator

Oracle Data Integratorを設定および使用するための手順は、Oracle Fusion Middlewareビッグ・データとOracle Data Integratorの統合を参照してください。

[1]
『Hadoop: The Definitive Guide, Third Edition』Tom White著(O'Reilly Media Inc., 2012, 978-1449311520)。

第II部 Oracle Databaseのコネクタ

この部には次の章が含まれます。

- Oracle SQL Connector for Hadoop Distributed File System

- Oracle Loader for Hadoop

2 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を使用する前に

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

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

- 外部表の作成

- HDFSデータ・パスの公開

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

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

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

- Oracle SQL Connector for HDFSの構成

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

2.1 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ファイルで指定します。

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

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

2.1.1 AvroとXML間の値の変換について

この項では、Oracle XQuery for HadoopがデータをAvroとXML間で変換する方法について説明します。

- XMLとしてのAvroの読取り

- AvroとしてのXMLの書込み

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

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

1. Oracle SQL Connector for HDFSをインストールするシステムにログインします。これには、Oracle Databaseシステム、Hadoopクラスタのノード、Hadoopクラスタのリモート・クライアントとして設定されているシステムがあります。

「Oracle DatabaseシステムへのHadoopクライアントのインストールと構成」を参照してください。

2. 初めてOracle SQL Connector for HDFSを使用する場合は、ソフトウェアが構成されていることを確認します。

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

3. セキュアなクラスタに接続する場合は、自分自身を認証するためにkinitを実行します。

「セキュアなHadoopクラスタでのOracle SQL Connector for HDFSの使用」を参照してください。

4. 接続とデータソースを指定するXMLドキュメントを作成します(ExternalTableコマンドにこれらのプロパティを指定していない場合)。

「外部表および場所ファイルの調査」を参照してください。

5. ExternalTableコマンドを含むシェル・スクリプトを作成します。

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

6. シェル・スクリプトを実行します。

7. ジョブが失敗した場合、出力の診断メッセージを使用してエラーを特定し、修正します。失敗した時点のジョブの進捗状況によっては、スクリプトを再実行する前にOracleデータベースから表の定義を削除する必要があります。

8. ジョブが成功した後、外部表の所有者としてOracle Databaseに接続します。この表に問い合せて、データにアクセスできることを確認します。

9. データの問合せが頻繁に行われる場合は、データベース表にロードして問合せのパフォーマンスを向上させることができます。外部表には索引やパーティションはありません。

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

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

「Oracle SQL Connector for HDFSで作成されたデータベース・オブジェクトの削除」を参照してください。

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

$ cat moviefact_hdfs.sh
# Add environment variables
export OSCH_HOME="/u01/connectors/orahdfs-3.4.0"

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.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

ここまでの手順を例2-1に例示します。

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

Oracle DatabaseシステムまたはHadoopクラスタのいずれかでOracle SQL Connector for HDFSが提供するExternalTableコマンドライン・ツールを実行できます。

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

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

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

環境変数の設定:

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

path/orahdfs-3.4.0/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-3.4.0"

関連項目:

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

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

2.4 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ソフトウェア・ユーザーズ・ガイド』を参照してください。

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

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

2.5.1 ExternalTableの概要

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

- 外部表の作成

- 場所ファイルの移入

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

- 場所ファイルのリスト

- 外部表の説明

これらのプロパティ値はXMLドキュメントに指定することも、コマンドラインで個々に指定することもできます。「Oracle SQL Connector for HDFSの構成」を参照してください。

2.5.2 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-3.4.0/jlib/orahdfs.jar \
oracle.hadoop.exttab.ExternalTable \
.
.
.

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

-conf config_file

実行するコマンドで必要なプロパティを含むXML構成ファイルの名前を特定します。「Oracle SQL Connector for HDFSの構成」を参照してください。

-D property=value

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

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

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

パーティション化Hive表の場合は、Oracle SQL Connector for HDFSによって外部表、ビューおよびメタデータ表が作成されます。表2-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を指定して実行することをお薦めします。

「HDFSデータ・パスの公開」を参照してください。

-listLocations [--details]

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

-getDDL

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

関連項目:

「構文の表記規則」

2.6 外部表の作成

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

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

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

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

- Hive表からの外部表の作成

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

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]

関連項目:

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

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

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以降では、このパッチは不要です。

2.6.2.1 必須プロパティ

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

- oracle.hadoop.exttab.tableName

- oracle.hadoop.exttab.defaultDirectory

- oracle.hadoop.exttab.dataPaths

- oracle.hadoop.exttab.sourceType=datapump

- oracle.hadoop.connection.url

- oracle.hadoop.connection.user

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

2.6.2.2 オプションのプロパティ

次のプロパティはオプションです。

- oracle.hadoop.exttab.logDirectory

- oracle.hadoop.exttab.createLogFiles

- oracle.hadoop.exttab.createBadFiles

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

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

例2-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>

2.6.2.4 例

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

例2-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-3.4.0"
$ 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

2.6.3 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で作成されたデータベース・オブジェクトの削除」を参照してください。

2.6.3.1 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のすべてのプリミティブ・タイプがサポートされています。

2.6.3.2 データ型のマッピング

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

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

ソースのHive列のデータ型

ターゲットのOracle列のデータ型

INT、BIGINT、SMALLINT、TINYINT

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)

2.6.3.3 必須プロパティ

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

- oracle.hadoop.exttab.tableName

- oracle.hadoop.exttab.defaultDirectory

- oracle.hadoop.exttab.sourceType=hive

- oracle.hadoop.exttab.hive.tableName

- oracle.hadoop.exttab.hive.databaseName

- oracle.hadoop.connection.url

- oracle.hadoop.connection.user

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

2.6.3.4 オプションのプロパティ

Hive表のソースの場合、次のプロパティはオプションです。

- oracle.hadoop.exttab.hive.columnType.*

- oracle.hadoop.exttab.hive.partitionFilter

- oracle.hadoop.exttab.locationFileCount

- oracle.hadoop.exttab.colMap.columnLength

- oracle.hadoop.exttab.colMap.column_name.columnLength

- oracle.hadoop.exttab.colMap.columnType

- oracle.hadoop.exttab.colMap.column_name.columnType

- oracle.hadoop.exttab.colMap.dateMask

- oracle.hadoop.exttab.colMap.column_name.dateMask

- oracle.hadoop.exttab.colMap.fieldLength

- oracle.hadoop.exttab.colMap.column_name.fieldLength

- oracle.hadoop.exttab.colMap.timestampMask

- oracle.hadoop.exttab.colMap.column_name.timestampMask

- oracle.hadoop.exttab.colMap.timestampTZMask

- oracle.hadoop.exttab.colMap.column_name.timestampTZMask

- oracle.hadoop.exttab.createLogFiles

- oracle.hadoop.exttab.createBadFiles

- oracle.hadoop.exttab.logDirectory

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

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

例2-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>

2.6.3.6 例

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

例2-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-3.4.0"
$ 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の値が外部表の名前です。

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

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

関連項目:

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

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

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

表2-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

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

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

注意:

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

2.6.3.7.2 メタデータ表の問合せ

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

表2-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表のCOUNTRY、STATEおよびCITYの列があり、COUNTRY、STATEおよび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表に問い合せる際にはビューを使用することをお薦めします。

2.6.3.7.3 問合せのための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条件。オプション。すべてのパーティションにデフォルト設定されています。

例2-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'''')'

2.6.3.7.4 エラー・メッセージ

table name too long, max limit length

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

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

table/view names containing string table_name found in schema schema_name

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

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

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

パーティション化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 Databaseリファレンス』

- 『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』

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

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

2.6.4.1 データ型のマッピング

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

2.6.4.2 必須プロパティ

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

- oracle.hadoop.exttab.tableName

- oracle.hadoop.exttab.defaultDirectory

- oracle.hadoop.exttab.dataPaths

- oracle.hadoop.exttab.columnCountまたはoracle.hadoop.exttab.columnNames

- oracle.hadoop.connection.url

- oracle.hadoop.connection.user

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

2.6.4.3 オプションのプロパティ

デリミタ付きテキストのソースの場合、次のプロパティはオプションです。

- oracle.hadoop.exttab.recordDelimiter

- oracle.hadoop.exttab.fieldTerminator

- oracle.hadoop.exttab.initialFieldEncloser

- oracle.hadoop.exttab.trailingFieldEncloser

- oracle.hadoop.exttab.locationFileCount

- oracle.hadoop.exttab.colMap.columnLength

- oracle.hadoop.exttab.colMap.column_name.columnLength

- oracle.hadoop.exttab.colMap.columnType

- oracle.hadoop.exttab.colMap.column_name.columnType

- oracle.hadoop.exttab.colMap.dateMask

- oracle.hadoop.exttab.colMap.column_name.dateMask

- oracle.hadoop.exttab.colMap.fieldLength

- oracle.hadoop.exttab.colMap.column_name.fieldLength

- oracle.hadoop.exttab.colMap.timestampMask

- oracle.hadoop.exttab.colMap.column_name.timestampMask

- oracle.hadoop.exttab.colMap.timestampTZMask

- oracle.hadoop.exttab.colMap.column_name.timestampTZMask

- oracle.hadoop.exttab.createLogFiles

- oracle.hadoop.exttab.createBadFiles

- oracle.hadoop.exttab.logDirectory

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

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

例2-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>

2.6.4.5 例

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

例2-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-3.4.0"
$ 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

2.6.5 SQLでの外部表の作成

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

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

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

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

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

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

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

2.7 HDFSデータ・パスの公開

-createTableコマンドは、デリミタ付きテキストおよびデータ・ポンプ・ソース用にOracle Databaseにメタデータを作成し、HDFSのデータ・ファイルのUniversal Resource Identifier (URI)で場所ファイルを移入します。次のような場合、外部表を作成する手順とは別の手順でURIを公開します。

- 既存の外部表に新しいデータを公開する場合。

- ExternalTableツールを使用せずに、外部表を手動で作成した場合。

どちらの場合も、-publishを指定したExternalTableコマンドを使用して、HDFSのデータ・ファイルのURIを外部表の場所ファイルに移入できます。「場所ファイルの管理」を参照してください。

注意:

publishオプションは、パーティション化Hive表を除くすべてのソースでサポートされています。パーティション化Hive表には、ExternalTableツールの-dropおよび-createTableコマンドを使用します。

2.7.1 公開用のExternalTable構文

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

関連項目:

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

2.7.2 公開用のExternalTableの例

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

例2-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は、例2-3で作成された外部表です。

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

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

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

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

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

- oracle.hadoop.exttab.tableName

- JDBC接続プロパティ。「接続プロパティ」を参照してください。

2.8.1 情報表示のためのExternalTable構文

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

関連項目:

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

2.8.2 情報表示のためのExternalTableの例

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

例2-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

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

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

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

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

- oracle.hadoop.exttab.tableName。パーティション化Hive表の場合は、これはメタデータ表の名前です。その他のデータソース・タイプの場合は、これは外部表の名前です。

- JDBC接続プロパティ。「接続プロパティ」を参照してください。

2.9.1 削除のためのExternalTable構文

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

関連項目:

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

2.9.2 削除のためのExternalTableの例

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

例2-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

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

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

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

関連項目:

- 外部表の詳細は、『Oracle Database管理者ガイド』

- 外部表、パフォーマンス・ヒント、およびORACLE_LOADERアクセス・ドライバを使用する際の制限事項の詳細は、『Oracle Databaseユーティリティ』

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

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

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

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

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

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

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

- oracle.hadoop.exttab.colMap.columnLength

- oracle.hadoop.exttab.colMap.columnType

- oracle.hadoop.exttab.colMap.dateMask

- oracle.hadoop.exttab.colMap.fieldLength

- oracle.hadoop.exttab.colMap.timestampMask

- oracle.hadoop.exttab.colMap.timestampTZMask

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

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

- oracle.hadoop.exttab.colMap.column_name.columnLength

- oracle.hadoop.exttab.colMap.column_name.columnType

- oracle.hadoop.exttab.colMap.column_name.dateMask

- oracle.hadoop.exttab.colMap.column_name.fieldLength

- oracle.hadoop.exttab.colMap.column_name.timestampMask

- oracle.hadoop.exttab.colMap.column_name.timestampTZMask

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

次のプロパティでは、すべての列がデフォルトの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

2.10.2 場所ファイルとは

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

2.10.3 並列処理の有効化

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

2.10.3.1 並列度の設定

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

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

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ヒントもパフォーマンスの向上に役立つことがあります。

2.10.4 場所ファイルの管理

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構成プロパティで示されます。

「接続プロパティ」を参照してください。

2.10.5 場所ファイルの名前

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

osch-timestamp-number-n

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

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

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

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

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

2.11 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コマンドライン・ツールの構文」を参照してください。

2.11.1 構成ファイルの作成

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

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

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

例2-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.exttab.dataCompressionCodec</name>
<value>org.apache.hadoop.io.compress.DefaultCodec</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>

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

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

- 一般的なプロパティ

- 接続プロパティ

一般的なプロパティ

プロパティ

説明

oracle.hadoop.exttab.colMap.columnLength

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

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

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

有効な値: 整数

oracle.hadoop.exttab.colMap.columnType

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

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

デフォルト値: テキストの場合はVARCHAR2です。Hiveについては、表2-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

外部表のCHAR、VARCHAR2、NCHAR、NVARCHAR2および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の値。このプロパティが設定されていない場合は、表2-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では、表2-4に示すように、デフォルトのフィールドの長さを設定します。

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

ターゲット列のデータ型

フィールドの長さ

VARCHAR2、NVARCHAR2、CHAR、NCHAR

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

RAW

2 * columnLengthプロパティ

CLOB、NCLOB

oracle.hadoop.exttab.colMap.fieldLengthの値

その他のすべての型

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

有効な値: 整数

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のようになります。nはoracle.hadoop.exttab.columnCountプロパティの値です。

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

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

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

oracle.hadoop.exttab.dataCompressionCodec

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

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

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

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

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

Hadoopクラスタ(Snappyなど)で使用できないコーデックを使用するには、まず、システムで別々にダウンロード、インストールおよび構成します。

デフォルト値: なし

oracle.hadoop.exttab.dataPaths

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

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

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

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

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

表2-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プロパティを使用します。

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

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

表2-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.tableName

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

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

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ディレクトリ・オブジェクト名。

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

例2-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.preprocessorDirectory

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

デフォルト値: OSCH_BIN_PATH

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

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

有効な値: datapump、hiveまたは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.createBadFiles

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

デフォルト値: TRUE

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

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

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つの形式を組み合せないでください。

接続プロパティ

プロパティ

説明

oracle.hadoop.connection.url

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

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

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

SQL> show parameter service

Oracle Walletが外部パスワード・ストアとして構成されている場合、プロパティ値は、ドライバ接頭辞jdbc:oracle:thin:@で始まる必要があり、db_connect_stringは、ウォレットに定義されている資格証明と完全に一致する必要があります。

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

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

有効な値: 1つの文字列

oracle.hadoop.connection.user

Oracleデータベースのログイン名を指定します。externalTableツールによって、パスワードの入力が求められます。Oracle Walletを外部パスワード・ストアとして使用する場合を除き、このプロパティは必須です。Oracle Walletまたは表2-*のプロパティを使用していない場合、externalTableツールによってパスワードの入力が求められます。

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

有効な値: 1つの文字列

oracle.hadoop.connection.password

Oracle Databaseユーザーのパスワード。このプロパティはデモ用のサンプルで使用します。パスワードの保存にはクリア・テキストを使用しないことをお薦めします。かわりにOracle Walletを使用してください。

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

有効な値: 1つの文字列

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を外部パスワード・ストアとして使用する場合、このプロパティを設定する必要があります。「oracle.hadoop.connection.wallet_location」を参照してください。

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

有効な値: 1つの文字列

oracle.hadoop.connection.wallet_location

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

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

有効な値: 1つの文字列

Oracle Walletを外部パスワード・ストアとして使用する場合、次のパラメータを設定します。

- oracle.hadoop.connection.wallet_location

- oracle.hadoop.connection.urlまたはoracle.hadoop.connection.tnsEntryName

- oracle.hadoop.connection.tns_admin

2.12 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;

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

[1] 表名の末尾に付く"_n"は数値を示します。

3 Oracle Loader for Hadoop

この章では、Oracle Loader for Hadoopを使用してApache HadoopからOracle Databaseの表にデータをロードする方法について説明します。内容は次のとおりです。

- Oracle Loader for Hadoopとは

- 操作モードの概要

- Oracle Loader for Hadoopを使用する前に

- ターゲット表の作成

- ジョブ構成ファイルの作成

- ターゲット表のメタデータの概要

- 入力形式の概要

- ターゲット表列への入力フィールドのマッピング

- 出力形式の概要

- ローダー・ジョブの実行

- 拒否されたレコードの処理

- パーティション化表にデータをロードする場合のロード・バランシング

- Oracleエンジニアド・システム間の通信の最適化

- Oracle Loader for Hadoop構成プロパティ・リファレンス

3.1 Oracle Loader for Hadoopとは

Oracle Loader for Hadoopは、HadoopクラスタからOracle Databaseの表にデータをすばやくロードするための効率的でパフォーマンスのよいローダーです。これは、必要に応じてデータを事前にパーティション化し、そのデータをデータベース対応形式に変換します。また、データのロードや出力ファイルの作成の前に主キーまたはユーザー指定の列でレコードをソートすることもできます。Oracle Loader for Hadoopは、他のローダーでは一般にデータベース・サーバーでロード処理の一部として行うこれらの事前処理を、Hadoopの並列処理フレームワークを利用して行います。これらの操作をHadoopにオフロードすることによってデータベース・サーバーに必要なCPUの量を削減し、他のデータベース・タスクのパフォーマンスに与える影響を軽減します。

Oracle Loader for Hadoopは、リデューサ間のデータのバランスを調整してパフォーマンスを向上させるJava MapReduceアプリケーションです。このアプリケーションは様々な入力データ形式を扱い、フィールドを集めたレコード形式でデータを表します。レコード形式のデータが存在するソース(AvroファイルやApache Hive表など)からデータを読み取ったり、テキスト・ファイルの行をフィールドに分割できます。

Oracle Loader for Hadoopを実行するには、hadoopコマンドライン・ユーティリティを使用します。コマンドラインで、ジョブの詳細を構成設定します。通常、これらの設定はジョブ構成ファイルに指定します。

Javaプログラミングのスキルがあれば、カスタム入力形式を定義して、ローダーで処理できるデータ・タイプを拡張できます。Oracle Loader for Hadoopは、そのカスタム・コードを使用してフィールドとレコードを抽出します。

3.2 操作モードの概要

Oracle Loader for Hadoopには次の2つの動作モードがあります。

- オンライン・データベース・モード

- オフライン・データベース・モード

3.2.1 オンライン・データベース・モード

オンライン・データベース・モードでは、Oracle Loader for Hadoopはジョブ構成ファイルまたはOracle Walletに格納されている資格証明を使用してターゲット・データベースに接続します。ローダーはこのデータベースから表のメタデータを取得します。新規レコードは、直接ターゲット表に挿入することも、Hadoopクラスタ内のファイルに書き込むこともできます。データベースのデータが必要なとき、またはデータベース・システムが比較的空いているときには、レコードを出力ファイルからロードできます。

図3-1は、オンライン・データベース・モードの要素間の関係を示しています。

図3-1 オンライン・データベース・モード

3.2.2 オフライン・データベース・モード

オフライン・データベース・モードでは、Oracle DatabaseシステムがHadoopクラスタと異なるネットワークにあるなどの事情によってデータベースにアクセスできない場合に、Oracle Loader for Hadoopを使用できます。このモードでは、Oracle Loader for Hadoopは表のメタデータ・ファイルに指定された情報を使用します。このメタデータ・ファイルは、ユーザーが別のユーティリティで生成します。ローダーのジョブによって、出力データがHadoopクラスタ上のバイナリまたはテキスト形式の出力ファイルに保存されます。Oracle Databaseにデータをロードする手順は、Oracle SQL Connector for Hadoop Distributed File System (HDFS)やSQL*Loaderなど、別のユーティリティを使用して別途実行します。

図3-2は、オフライン・データベース・モードの要素間の関係を示しています。この図には、データをターゲット表にロードする別途の手順は示されていません。

図3-2 オフライン・データベース・モード

3.3 Oracle Loader for Hadoopを使用する前に

Oracle Loader for Hadoopを使用する場合は、次の基本的な手順に従います。

1. 初めてOracle Loader for Hadoopを使用する場合は、ソフトウェアがインストールおよび構成されていることを確認します。

「Oracle Loader for Hadoopの設定」を参照してください。

2. Oracle Databaseに接続してターゲット表を作成します。

「ターゲット表の作成」を参照してください。

3. オフライン・データベース・モードを使用する場合、表のメタデータを生成します。

「ターゲット表メタデータの生成(オフライン・データベース・モードの場合)」を参照してください。

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

5. オフライン・データベース・モードを使用する場合、ログインしたHadoopシステムに表のメタデータをコピーします。

6. 構成ファイルを作成します。このファイルは、ターゲット表のメタデータへのアクセス、データの入力形式、出力形式などの構成情報を示すXMLドキュメントです。

「ジョブ構成ファイルの作成」を参照してください。

7. 入力フィールドをOracleデータベース表の列にマップするXMLドキュメントを作成します。オプション。

「ターゲット表列への入力フィールドのマッピング」を参照してください。

8. Oracle Loader for Hadoopのジョブを実行するシェル・スクリプトを作成します。

「ローダー・ジョブの実行」を参照してください。

9. セキュアなクラスタに接続する場合は、自分自身を認証するためにkinitを実行します。

10. シェル・スクリプトを実行します。

11. ジョブが失敗した場合、出力の診断メッセージを使用してエラーを特定し、修正します。

「ジョブのレポート作成」を参照してください。

12. ジョブが成功したら、コマンド出力を参照し、拒否されたレコード数を確認します。拒否されたレコードが多すぎる場合は、入力形式のプロパティの変更が必要になることがあります。

13. テキスト・ファイルまたはデータ・ポンプ形式ファイルを生成した場合は、次のいずれかの方法でOracle Databaseにデータをロードします。

- Oracle SQL Connector for HDFSを使用して外部表を作成します(オンライン・データベース・モードの場合のみ)。
「Oracle SQL Connector for Hadoop Distributed File System」を参照してください。

- ファイルをOracle Databaseシステムにコピーし、SQL*Loaderまたは外部表を使用してターゲット・データベース表にデータをロードします。Oracle Loader for Hadoopで、この方法に使用できるスクリプトが生成されます。
「DelimitedTextOutputFormatの概要」または「DataPumpOutputFormatの概要」を参照してください。

14. ターゲット表の所有者としてOracle Databaseに接続します。この表に問い合せて、データが適切にロードされたことを確認します。適切にロードされなかった場合は、必要に応じて入力形式または出力形式のプロパティを変更し、問題を修正してください。

15. OraLoaderジョブを本番環境で実行する前に、次の最適化を行います。

- パーティション化表にデータをロードする場合のロード・バランシング

- Oracleエンジニアド・システム間の通信の最適化

3.4 ターゲット表の作成

Oracle Loader for Hadoopはデータを1つのターゲット表にロードします。この表はOracleデータベース内に存在する必要があります。表は、空でも、データが格納されていてもかまいません。Oracle Loader for Hadoopは既存のデータを上書きしません。

表は、他の用途に使用する場合も同じ方法で作成します。その際は、次の制限に従う必要があります。

- ターゲット表でサポートされるデータ型

- ターゲット表でサポートされるパーティション化方式

3.4.1 ターゲット表でサポートされるデータ型

ターゲット表の定義には次のデータ型を使用できます。

- BINARY_DOUBLE

- BINARY_FLOAT

- CHAR

- DATE

- FLOAT

- INTERVAL DAY TO SECOND

- INTERVAL YEAR TO MONTH

- NCHAR

- NUMBER

- NVARCHAR2

- RAW

- TIMESTAMP

- TIMESTAMP WITH LOCAL TIME ZONE

- TIMESTAMP WITH TIME ZONE

- VARCHAR2

ターゲット表には、サポートされていないデータ型の列が含まれていてもかまいませんが、これらの列はnull値可能である必要があります。そうでない場合、値を設定します。

3.4.2 ターゲット表でサポートされるパーティション化方式

パーティション化は、非常に大規模な表の管理および効率的な問合せを行うためのデータベースの機能です。アプリケーションに対して完全に透過的な方法で、大規模な表をパーティションと呼ばれる小規模でより管理し易いサイズに分割する方法を提供します。

ターゲット表の定義には、次のシングルレベルおよびコンポジットレベルのパーティション化方式を使用できます。

- ハッシュ

- ハッシュ-ハッシュ

- ハッシュ-リスト

- ハッシュ-レンジ

- 時間隔

- 時間隔-ハッシュ

- 時間隔-リスト

- 時間隔-レンジ

- リスト

- リスト-ハッシュ

- リスト-リスト

- リスト-レンジ

- レンジ

- レンジ-ハッシュ

- レンジ-リスト

- レンジ-レンジ

Oracle Loader for Hadoopでは、参照パーティション化または仮想列ベースのパーティション化はサポートされません。

関連項目:

『Oracle Database VLDBおよびパーティショニング・ガイド』

3.4.3 圧縮

Oracle Loader for Hadoopでは、データを圧縮しません。ロード中にデータを圧縮する場合は、表およびデータベースのプロパティによって定義します。圧縮された表にデータをロードするには、表プロパティおよびデータベース・プロパティでそれぞれ定義してください。

3.5 ジョブ構成ファイルの作成

構成ファイルは、HadoopがMapReduceジョブを実行するために必要なすべての情報を格納しているXMLドキュメントです。このファイルには、Oracle Loader for Hadoopに必要なすべての情報も指定できます。「Oracle Loader for Hadoop構成プロパティ・リファレンス」を参照してください。

構成プロパティは、Oracle Loader for Hadoopのすべてのジョブに必要な次の情報を示します。

- ターゲット表のメタデータの取得方法
「ターゲット表のメタデータの概要」を参照してください。

- 入力データの形式
「入力形式の概要」を参照してください。

- 出力データの形式
「出力形式の概要」を参照してください。

OraLoaderは、org.apache.hadoop.util.Toolインタフェースを実装し、MapReduceアプリケーションを構築する標準的なHadoopの方法に従います。これらの構成プロパティは、以下に示すようなファイルまたはhadoopのコマンドラインで指定できます。「ローダー・ジョブの実行」を参照してください。

ファイルの作成には任意のテキスト・エディタまたはXMLエディタを使用できます。例3-1に、ジョブ構成ファイルの例を示します。

例3-1 ジョブ構成ファイル

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>

<!--                          Input settings                             -->
<property>
<name>mapreduce.job.inputformat.class</name>
<value>oracle.hadoop.loader.lib.input.DelimitedTextInputFormat</value>
</property>

<property>
<name>mapreduce.input.fileinputformat.inputdir</name>
<value>/user/oracle/moviedemo/session/*00000</value>
</property>

<property>
<name>oracle.hadoop.loader.input.fieldTerminator</name>
<value>\u0009</value>
</property>

<property>
<name>oracle.hadoop.loader.input.fieldNames</name>
<value>SESSION_ID,TIME_IDDATE,CUST_ID,DURATION_SESSION,NUM_RATED,DURATION_RATED,NUM_COMPLETED,DURATION_COMPLETED,TIME_TO_FIRST_START,NUM_STARTED,NUM_BROWSED,DURATION_BROWSED,NUM_LISTED,DURATION_LISTED,NUM_INCOMPLETE,NUM_SEARCHED</value>
</property>

<property>
<name>oracle.hadoop.loader.defaultDateFormat</name>
<value>yyyy-MM-dd:HH:mm:ss</value>
</property>

<!--                          Output settings                             -->
<property>
<name>mapreduce.job.outputformat.class</name>
<value>oracle.hadoop.loader.lib.output.OCIOutputFormat</value>
</property>

<property>
<name>mapreduce.output.fileoutputformat.outputdir</name>
<value>temp_out_session</value>
</property>

<!--                          Table information                           -->
<property>
<name>oracle.hadoop.loader.loaderMap.targetTable</name>
<value>movie_sessions_tab</value>
</property>

<!--                          Connection information                      -->

<property>
<name>oracle.hadoop.loader.connection.url</name>
<value>jdbc:oracle:thin:@${HOST}:${TCPPORT}/${SERVICE_NAME}</value>
</property>

<property>
<name>TCPPORT</name>
<value>1521</value>
</property>

<property>
<name>HOST</name>
<value>myoraclehost.example.com</value>
</property>

<property>
<name>SERVICE_NAME</name>
<value>orcl</value>
</property>

<property>
<name>oracle.hadoop.loader.connection.user</name>
<value>MOVIEDEMO</value>
</property>

<property>
<name>oracle.hadoop.loader.connection.password</name>
<value>oracle</value>
<description> A password in clear text is NOT RECOMMENDED. Use an Oracle wallet instead.</description>
</property>

</configuration>

3.6 ターゲット表のメタデータの概要

ターゲット表に関する情報をOracle Loader for Hadoopに指定する必要があります。この情報の指定方法は、Oracle Loader for Hadoopをオンライン・データベース・モードまたはオフライン・データベース・モードのどちらで実行するかによって異なります。「操作モードの概要」を参照してください。

3.6.1 オンライン・データベース・モードの接続詳細の指定

Oracle Loader for HadoopはOracleデータベースの表のメタデータを使用して列名、データ型、パーティションなどを識別します。JDBC接続が確立可能な場合、ローダーでメタデータを自動的にフェッチします。

資格証明にはウォレットを使用することをお薦めします。Oracleウォレットを使用するには、次のプロパティをジョブ構成ファイルに入力します。

- oracle.hadoop.loader.connection.wallet_location

- oracle.hadoop.loader.connection.tns_admin

- oracle.hadoop.loader.connection.urlまたはoracle.hadoop.loader.connection.tnsEntryName

パスワードは、クリア・テキストには保存しないで、ウォレットを使用して資格証明を保護することをお薦めします。Oracle Walletを使用しない場合は、次のプロパティを入力します。

- oracle.hadoop.loader.connection.url

- oracle.hadoop.loader.connection.user

- oracle.hadoop.loader.connection.password

3.6.2 ターゲット表メタデータの生成(オフライン・データベース・モードの場合)

ローダー・ジョブでデータベースにアクセスできない場合があります。たとえば、HadoopクラスタがOracle Databaseとは別のネットワークにある場合などです。この場合、OraLoaderMetadataユーティリティを使用して、ターゲット表のメタデータをファイルに抽出し、保存します。

オフライン・データベース・モードでターゲット表のメタデータを指定するには、次の手順を実行します。

1. Oracle Databaseシステムにログインします。

2. 初めてオフライン・データベース・モードを使用する場合は、データベース・システムがインストールおよび構成されていることを確認します。
「オフライン・データベース・モードのサポート」を参照してください。

3. OraLoaderMetadataユーティリティ・プログラムを実行して、表のメタデータをエクスポートします。「OraLoaderMetadataユーティリティ」を参照してください。

4. 表のメタデータが格納されている生成済XMLファイルをHadoopクラスタにコピーします。

5. ジョブ構成ファイルのoracle.hadoop.loader.tableMetadataFileプロパティを使用して、Hadoopクラスタ上のXMLメタデータの場所を指定します。
ローダー・ジョブの実行時、このXMLドキュメントがアクセスされ、ターゲット表のメタデータが検出されます。

3.6.2.1 OraLoaderMetadataユーティリティ

Oracle Databaseシステムで、次の構文を使用してOraLoaderMetadataユーティリティを実行します。javaコマンドは1行で入力する必要がありますが、以下では見やすくするために複数行に分けて示しています。

java oracle.hadoop.loader.metadata.OraLoaderMetadata
-user userName
-connection_url connection
[-schema schemaName]
-table tableName
-output fileName.xml

OraLoaderMetadataのヘルプ・ファイルを表示するには、このコマンドをオプションなしで使用します。

オプション

-user userName

ターゲット表を所有するOracle Databaseユーザー。ユーザーは、パスワードを要求されます。

-connection_url connection

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

jdbc:oracle:thin:@//hostName:port/serviceName

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

show parameter service

NAME               TYPE        VALUE
------------------ ----------- ----------
service_names      string      orcl

-schema schemaName

ターゲット表を含むスキーマの名前。引用符で囲まれていない値は大文字に変換され、引用符で囲まれていない値は入力したとおりに使用されます。このオプションを省略した場合、-userオプションで指定したスキーマ内のターゲット表が検索されます。

-table tableName

ターゲット表の名前。引用符で囲まれていない値は大文字に変換され、引用符で囲まれていない値は入力したとおりに使用されます。

-output fileName.xml

メタデータ・ドキュメントの格納に使用される出力ファイルの名前。

例3-2に、ターゲット表のメタデータをXMLファイルに保存する方法を示します。

例3-2 表のメタデータの生成

OraLoaderMetadataユーティリティを実行します。

$ java -cp '/tmp/oraloader-3.5.0-h2/jlib/*' oracle.hadoop.loader.metadata.OraLoaderMetadata -user HR -connection_url jdbc:oracle:thin://@localhost:1521/orcl.example.com -table EMPLOYEES -output employee_metadata.xml

OraLoaderMetadataユーティリティを実行すると、データベース・パスワードを要求されます。

Oracle Loader for Hadoop Release 3.5.0 - Production

Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.

[Enter Database Password:] password

XMLファイルがスクリプトと同じディレクトリに作成されます。

$ more employee_metadata.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
Oracle Loader for Hadoop Release 3.5.0 - Production

Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.

-->
<DATABASE>
<ROWSET><ROW>
<TABLE_T>
<VERS_MAJOR>2</VERS_MAJOR>
<VERS_MINOR>5 </VERS_MINOR>
<OBJ_NUM>78610</OBJ_NUM>
<SCHEMA_OBJ>
<OBJ_NUM>78610</OBJ_NUM>
<DATAOBJ_NUM>78610</DATAOBJ_NUM>
<OWNER_NUM>87</OWNER_NUM>
<OWNER_NAME>HR</OWNER_NAME>
<NAME>EMPLOYEES</NAME>
.
.
.

3.7 入力形式の概要

入力形式は、Hadoopに保存されている特殊な種類のデータを読み取る場合に使用します。次に示す様々な入力形式を使用して、Hadoopで一般的に利用されるデータ形式を読み取ることができます。

- デリミタ付きテキスト入力形式

- 複合テキスト入力形式

- Hive表入力形式

- Avro入力形式

- Oracle NoSQL Database入力形式

固有のカスタム入力形式を使用することもできます。組込み形式の説明に、カスタムInputFormatクラスの開発に役立つ情報を記入します。「カスタム入力形式」を参照してください。

データベース表にロードするデータの特定の入力形式を指定するには、ジョブ構成ファイルのmapreduce.job.inputformat.class構成プロパティを使用します。

注意:

組込みテキスト形式では、引用符で囲んだ値に埋め込まれたヘッダー行や改行文字(\n)は処理されません。

3.7.1 デリミタ付きテキスト入力形式

デリミタ付きテキスト・ファイルからデータをロードするには、mapreduce.job.inputformat.classを次のように設定します

oracle.hadoop.loader.lib.input.DelimitedTextInputFormat

3.7.1.1 DelimitedTextInputFormatの概要

入力ファイルは次の要件に従う必要があります。

- レコードは改行文字で区切る。

- フィールドは、カンマやタブなどの1文字のマーカーで区切る。

空の文字列のトークンは囲まれていても囲まれていなくても、nullで置き換えられます。

DelimitedTextInputFormatは、SQL*Loaderのトークン化方式をエミュレートします。つまり、各データはtで終了し、オプションでieまたはieとteで囲みます。DelimitedTextInputFormatは次の構文規則に従います。tはフィールドの終端文字、ieは開始フィールド囲み文字、teは終了フィールド囲み文字、cは1文字です。

- Line = Token t Line | Token\n

- Token = EnclosedToken | UnenclosedToken

- EnclosedToken = (white-space)* ie [(non-te)* te te]* (non-te)* te (white-space)*

- UnenclosedToken = (white-space)* (non-t)*

- white-space = {c | Character.isWhitespace(c) and c!=t}

囲まれたトークン(データ値)の前後の空白は破棄されます。囲まれていないトークンの場合、先頭の空白は破棄されますが、末尾の空白(ある場合)は破棄されません。

この実装では、カスタム囲み文字と終端文字は許可されますが、レコード終端文字は改行、空白はJavaのCharacter.isWhitespaceにハードコードされます。空白はフィールドの終端文字として定義できますが、その文字は、あいまいになるのを防ぐために空白文字のクラスから削除されます。

圧縮テキスト・ファイルは、読取り時にHadoopによって自動的に解凍されます。

3.7.1.2 必須の構成プロパティ

ありません。デフォルトの形式では、フィールドをカンマで区切り、フィールドの囲み文字は使用しません。

3.7.1.3 オプションの構成プロパティ

DelimitedTextInputFormatのフィールド・デリミタを定義するには、次のいずれかのプロパティを使用します。

- oracle.hadoop.loader.input.fieldTerminator

- oracle.hadoop.loader.input.initialFieldEncloser

- oracle.hadoop.loader.input.trailingFieldEncloser

入力フィールドの名前を指定するには、次のプロパティを使用します。

- oracle.hadoop.loader.input.fieldNames

3.7.2 複合テキスト入力形式

DelimitedTextInputFormatで処理するには複雑すぎるテキスト・ファイルからデータをロードするには、mapreduce.job.inputformat.classを次のように設定します

oracle.hadoop.loader.lib.input.RegexInputFormat

たとえば、Webログのあるフィールドが引用符で区切られ、別のフィールドが角カッコで区切られている場合があります。

3.7.2.1 RegexInputFormatの概要

RegexInputFormatを使用する場合、レコードは改行文字で区切る必要があります。各テキスト行のフィールドは、正規表現のマッチングによって識別されます。

- 正規表現はテキスト行全体が一致する必要があります。

- フィールドの識別には正規表現のキャプチャ・グループが使用されます。

RegexInputFormatはjava.util.regexの正規表現ベースのパターン・マッチング・エンジンを使用します。圧縮ファイルは、読取り時にHadoopによって自動的に解凍されます。

関連項目:

java.util.regexの詳細は、次のサイトにあるJava Platform Standard Edition 6 Javaリファレンスを参照してください。

http://docs.oracle.com/javase/6/docs/api/java/util/regex/package-summary.html

3.7.2.2 必須の構成プロパティ

データ入力ファイルを記述するには、次のプロパティを使用します。

- oracle.hadoop.loader.input.regexPattern

3.7.2.3 オプションの構成プロパティ

すべての入力フィールドの名前を識別するには、次のプロパティを使用します。

- oracle.hadoop.loader.input.fieldNames

大文字と小文字を区別しないマッチングを有効にするには、次のプロパティを使用します。

- oracle.hadoop.loader.input.regexCaseInsensitive

3.7.3 Hive表入力形式

Hive表からデータをロードするには、mapreduce.job.inputformat.classを次のように設定します

oracle.hadoop.loader.lib.input.HiveToAvroInputFormat

3.7.3.1 HiveToAvroInputFormatの概要

パーティション化されていない表の場合は、HiveToAvroInputFormatが表全体(Hive表のディレクトリ内の全ファイル)をインポートします。

パーティション化表の場合は、HiveToAvroInputFormatが1つ以上のパーティションをインポートします。パーティションはロードまたはスキップのいずれかを行うことができます。ただし、パーティションを一部ロードすることはできません。

Oracle Loader for Hadoopは、複合(非プリミティブの)列に値があるすべての行を拒否します。プリミティブ値に解決するUNIONTYPEフィールドがサポートされています。「拒否されたレコードの処理」を参照してください。

HiveToAvroInputFormatは、Hive表の行をAvroレコードに変換し、Hive表の列名を大文字に変換して、フィールド名を生成します。この自動大文字変換により、フィールド名がターゲット表の列名と一致する確率が高くなります。「ターゲット表列への入力フィールドのマッピング」を参照してください。

注意:

この入力形式では、列名に引用符で囲まれた識別子が使用されているHive表はサポートされません。「HIVE-6013」を参照してください

HiveToAvroInputFormatはSQL Standard Based Hive Authorizationを実施しないことにも注意してください。詳細は、https://cwiki.apache.org/confluence/display/Hive/SQL+Standard+Based+Hive+Authorizationを参照してください。

3.7.3.2 必須の構成プロパティ

次の構成プロパティを使用して、Hiveのデータベースと表の名前を指定する必要があります。

- oracle.hadoop.loader.input.hive.databaseName

- oracle.hadoop.loader.input.hive.tableName

3.7.3.3 オプションの構成プロパティ

ロードする入力Hive表の行のサブセットを指定するには、次のプロパティを使用します。

- oracle.hadoop.loader.input.hive.rowFilter

3.7.4 Avro入力形式

標準的なAvro形式のレコードが格納されているバイナリAvroデータ・ファイルからデータをロードするには、mapreduce.job.inputformat.classを次のように設定します

oracle.hadoop.loader.lib.input.AvroInputFormat

拡張子が.avroのファイルのみを処理するには、mapreduce.input.fileinputformat.inputdir構成プロパティにリストされているディレクトリに*.avroを追加します。

3.7.4.1 構成プロパティ

ありません。

3.7.5 Oracle NoSQL Database入力形式

Oracle NoSQL Databaseからデータをロードするには、mapreduce.job.inputformat.classを次のように設定します

oracle.kv.hadoop.KVAvroInputFormat

この入力形式はOracle NoSQL Database 11g、リリース2以降で定義されています。

3.7.5.1 KVAvroInputFormatの概要

Oracle Loader for Hadoopでは、KVAvroInputFormatを使用してOracle NoSQL Databaseから直接データを読み取ります。

KVAvroInputFormatは、Oracle NoSQL Databaseのキーと値のペアからキーではなく値を渡します。Oracle NoSQL DatabaseのキーにAvroデータ値としてアクセスする必要がある場合(ターゲット表に格納する場合など)、oracle.kv.hadoop.AvroFormatterを実装するJavaのInputFormatクラスを作成する必要があります。その後で、Oracle Loader for Hadoop構成ファイルのoracle.kv.formatterClassプロパティを指定できます。

KVAvroInputFormatクラスはorg.apache.hadoop.mapreduce.InputFormat<oracle.kv.Key, org.apache.avro.generic.IndexedRecord>のサブクラスです。

関連項目:

次のサイトにあるKVInputFormatBaseクラスのJavadoc

http://docs.oracle.com/cd/NOSQL/html/javadoc/index.html

3.7.5.2 必須の構成プロパティ

次の構成プロパティを使用して、キーと値のストアの名前と場所を指定する必要があります。

- oracle.kv.hosts

- oracle.kv.kvstore

「Oracle NoSQL Databaseの構成プロパティ」を参照してください。

3.7.6 カスタム入力形式

組込み入力形式では不十分な場合は、カスタム入力形式のJavaクラスを作成できます。以下では、Oracle Loader for Hadoopで使用できる入力形式のフレームワークについて説明します。

3.7.6.1 カスタム入力形式の実装の概要

Oracle Loader for Hadoopは、org.apache.hadoop.mapreduce.InputFormatを拡張するクラスから入力を取得します。このクラスの名前をmapreduce.job.inputformat.class構成プロパティに指定する必要があります。

この入力形式では、getCurrentValueメソッドからAvroのIndexedRecord入力オブジェクトを返すRecordReaderインスタンスを作成する必要があります。次のメソッド・シグネチャを使用します。

public org.apache.avro.generic.IndexedRecord getCurrentValue()
throws IOException, InterruptedException;

Oracle Loader for Hadoopでは、IndexedRecord入力オブジェクトのスキーマを使用して入力フィールドの名前を検出し、ターゲット表の列にマップします。

3.7.6.2 エラー処理の概要

IndexedRecordの値の処理でエラーが発生した場合、Oracle Loader for HadoopはRecordReaderのgetCurrentKeyメソッドで返されるオブジェクトを使用してフィードバックを提供します。また、キーのtoStringメソッドを呼び出し、結果をエラー・メッセージで書式設定します。InputFormatの開発者は、次のいずれかの情報を返すことにより、拒否されたレコードの識別でユーザーを支援できます。

- データ・ファイルのURI

- InputSplit情報

- データ・ファイル名とそのファイルのレコードのオフセット

機密情報が含まれる可能性があるため、レコードをクリア・テキスト形式で返すことはお薦めできません。返された値はクラスタ全体のHadoopのログに出力できます。「拒否されたレコードの不正なファイルへのロギング」を参照してください。

レコードが失敗すると、キーがnullの場合、ローダーは識別情報を生成しません。

3.7.6.3 データ・サンプリングのサポート

Oracle Loader for Hadoopは、サンプラを使用してMapReduceジョブのパフォーマンスを向上させます。サンプラはマルチスレッド化され、各サンプラ・スレッドは、指定されたInputFormatクラスのコピーをインスタンス化します。新しいInputFormatを実装する場合は、スレッドセーフであることを確認します。「パーティション化表にデータをロードする場合のロード・バランシング」を参照してください。

3.7.6.4 InputFormatのサンプル・ソース・コード

Oracle Loader for HadoopにはInputFormatのサンプル・ソース・コードが用意されており、このソース・コードはexamples/jsrc/ディレクトリにあります。

サンプルの形式では、データを単純なカンマ区切り値(CSV)ファイルからロードします。この入力形式を使用するには、oracle.hadoop.loader.examples.CSVInputFormatをジョブ構成ファイルのmapreduce.job.inputformat.classの値として指定します。

この入力形式では、F0、F1、F2といったフィールド名が自動的に割り当てられます。構成プロパティはありません。

3.8 ターゲット表列への入力フィールドのマッピング

マッピングは、入力フィールドをターゲット表のどの列にロードするかを示します。自動マッピング機能を使用することも、常に手動で入力フィールドをターゲット列にマップすることもできます。

3.8.1 自動マッピング

Oracle Loader for Hadoopでは、入力データが次の要件に従っていれば、フィールドを適切な列に自動的にマップできます。

- ターゲット表のすべての列をロードする。

- IndexedRecord入力オブジェクトの入力データ・フィールド名が列名と完全に一致している。

- DATE列にマップされるすべての入力フィールドを、同じJava日付形式を使用して解析できる。

自動マッピングの場合は、次の構成プロパティを使用します。

- oracle.hadoop.loader.loaderMap.targetTable: ターゲット表を識別します。

- oracle.hadoop.loader.defaultDateFormat: すべてのDATEフィールドに適用するデフォルトの日付形式を指定します。

3.8.2 手動マッピング

自動マッピングの要件に準拠していないロードの場合は、追加のプロパティを定義する必要があります。これらのプロパティでは、次のことが可能です。

- データをターゲット表の列のサブセットにロードする。

- 入力フィールド名がデータベースの列名とまったく同じではない場合に、明示的なマッピングを作成する。

- 入力フィールドごとに異なる日付形式を指定する。

手動マッピングの場合は、次のプロパティを使用します。

- oracle.hadoop.loader.loaderMap.targetTable構成プロパティは、ターゲット表を識別します。必須。

- oracle.hadoop.loader.loaderMap.columnNames: ロード対象の列をリストします。

- oracle.hadoop.loader.defaultDateFormat: すべてのDATEフィールドに適用するデフォルトの日付形式を指定します。

- oracle.hadoop.loader.loaderMap.column_name.format: 特定の列のデータ形式を指定します。

- oracle.hadoop.loader.loaderMap.column_name.field: 特定の列にマップされるAvroレコード・フィールドの名前を識別します。

3.8.3 ローダー・マップ・ファイルの変換

次のユーティリティは、以前のリリースのローダー・マップ・ファイルを構成ファイルに変換します。

hadoop oracle.hadoop.loader.metadata.LoaderMap -convert map_file conf_file

オプション

map_file

ローカル・ファイル・システム(HDFSではなく)にある入力のローダー・マップ・ファイルの名前。

conf_file

ローカル・ファイル・システム(HDFSではなく)にある出力の構成ファイルの名前。

例3-3に、サンプルの変換を示します。

例3-3 ローダー・ファイルから構成プロパティへの変換

$ HADOOP_CLASSPATH="$OLH_HOME/jlib/*:$HADOOP_CLASSPATH"
$ hadoop oracle.hadoop.loader.metadata.LoaderMap -convert loadermap.xml conf.xml
Oracle Loader for Hadoop Release 3.5.0 - Production

Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.

入力のローダー・マップ・ファイルのloadermap.xml

<?xml version="1.0" encoding="UTF-8"?>
<LOADER_MAP>
<SCHEMA>HR</SCHEMA>
<TABLE>EMPLOYEES</TABLE>
<COLUMN field="F0">EMPLOYEE_ID</COLUMN>
<COLUMN field="F1">LAST_NAME</COLUMN>
<COLUMN field="F2">EMAIL</COLUMN>
<COLUMN field="F3" format="MM-dd-yyyy">HIRE_DATE</COLUMN>
<COLUMN field="F4">JOB_ID</COLUMN>
</LOADER_MAP>

出力の構成ファイルのconf.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<configuration>
<property>
<name>oracle.hadoop.loader.loaderMap.targetTable</name>
<value>HR.EMPLOYEES</value>
</property>
<property>
<name>oracle.hadoop.loader.loaderMap.columnNames</name>
<value>EMPLOYEE_ID,LAST_NAME,EMAIL,HIRE_DATE,JOB_ID</value>
</property>
<property>
<name>oracle.hadoop.loader.loaderMap.EMPLOYEE_ID.field</name>
<value>F0</value>
</property>
<property>
<name>oracle.hadoop.loader.loaderMap.EMPLOYEE_ID.format</name>
<value></value>
</property>
<property>
<name>oracle.hadoop.loader.loaderMap.LAST_NAME.field</name>
<value>F1</value>
</property>
<property>
<name>oracle.hadoop.loader.loaderMap.LAST_NAME.format</name>
<value></value>
</property>
<property>
<name>oracle.hadoop.loader.loaderMap.EMAIL.field</name>
<value>F2</value>
</property>
<property>
<name>oracle.hadoop.loader.loaderMap.EMAIL.format</name>
<value></value>
</property>
<property>
<name>oracle.hadoop.loader.loaderMap.HIRE_DATE.field</name>
<value>F3</value>
</property>
<property>
<name>oracle.hadoop.loader.loaderMap.HIRE_DATE.format</name>
<value>MM-dd-yyyy</value>
</property>
<property>
<name>oracle.hadoop.loader.loaderMap.JOB_ID.field</name>
<value>F4</value>
</property>
<property>
<name>oracle.hadoop.loader.loaderMap.JOB_ID.format</name>
<value></value>
</property>
</configuration>

3.9 出力形式の概要

オンライン・データベース・モードでは、データを直接Oracleデータベース表にロードするか、ファイルに保存するかを選択できます。オフライン・データベース・モードでは、出力データの保存先はファイルに制限され、このファイルをターゲット表に個別のプロシージャとしてロードできます。ジョブ構成ファイルに出力形式を指定するには、mapreduce.job.outputformat.classプロパティを使用します。

次の出力形式から選択します。

- JDBC出力形式: データをターゲット表に直接ロードします。

- Oracle OCIダイレクト・パス出力形式: データをターゲット表に直接ロードします。

- デリミタ付きテキスト出力形式: データをローカル・ファイルに保存します。

- Oracle Data Pump出力形式: データをローカル・ファイルに保存します。

3.9.1 JDBC出力形式

HadoopシステムとOracle Databaseとの間のJDBC接続を利用してデータをロードできます。ローダー・ジョブの出力レコードは、タスクをオンライン・データベース・モードのOraLoaderプロセスの一部としてマップまたはリデュースすると、ターゲット表に直接ロードされます。データをロードするための追加手順は不要です。

ジョブの実行中は、HadoopクラスタとOracle Databaseシステムとの間のJDBC接続をオープンしている必要があります。

この出力形式を使用するには、mapreduce.job.outputformat.classを次のように設定します

oracle.hadoop.loader.lib.output.JDBCOutputFormat

3.9.1.1 JDBCOutputFormatの概要

JDBCOutputFormatでは、標準のJDBCバッチを使用してパフォーマンスと効率を最適化します。バッチの実行中に制約違反などのエラーが発生した場合、JDBCドライバはただちに実行を停止します。つまり、バッチに100行あり、10行目でエラーが発生した場合、9行は挿入され、91行は挿入されません。

JDBCドライバではエラーが発生した行が特定されないため、Oracle Loader for Hadoopでは、バッチ内の各行の挿入ステータスは把握されません。バッチ内のエラーが発生したすべての行に問題があるとみなされ、行はターゲット表に挿入される場合もあれば、挿入されない場合もあります。次のバッチのロードが続けられます。バッチ・エラーの数と問題のある行の数を示すロード・レポートがジョブの最後に生成されます。

この問題に対処する方法の1つは、ターゲット表に対して一意キーを定義することです。たとえば、HR.EMPLOYEES表にEMPLOYEE_IDという名前の主キーがあるとします。この場合、データをHR.EMPLOYEESにロードした後、EMPLOYEE_IDで問合せを行って欠落している従業員IDを検出します。欠落している従業員IDが入力データに見つかったら、ロードに失敗した原因を特定し、再度ロードを試行できます。

3.9.1.2 構成プロパティ

バッチ・サイズを制御するには、次のプロパティを設定します。

oracle.hadoop.loader.connection.defaultExecuteBatch

3.9.2 Oracle OCIダイレクト・パス出力形式

Oracle Call Interface (OCI)のダイレクト・パス・インタフェースを使用して、データをターゲット表にロードします。オンライン・データベース・モードでは、各リデューサが異なるデータベース・パーティションにロードするため、並列ロードのパフォーマンス向上が可能になります。データをロードするための追加手順は不要です。

ジョブの実行中は、HadoopクラスタとOracle Databaseシステムとの間のOCI接続をオープンしている必要があります。

この出力形式を使用するには、mapreduce.job.outputformat.classを次のように設定します

oracle.hadoop.loader.lib.output.OCIOutputFormat

3.9.2.1 OCIOutputFormatの概要

OCIOutputFormatには、次の制限があります。

- Linux x86.64プラットフォームでのみ使用できます。

- MapReduceジョブで1つ以上のリデューサを作成する必要があります。

- ターゲット表は、パーティション化されている必要があります。

- Oracle Database 11g (11.2.0.3)では、ターゲット表が、サブパーティション・キーにCHAR、VARCHAR2、NCHARまたはNVARCHAR2列が含まれるコンポジット時間隔パーティション化表の場合、Oracle Bug#13498646を適用します。後続バージョンのOracle Databaseでは、このパッチは必要ありません。

3.9.2.2 構成プロパティ

ダイレクト・パス・ストリーム・バッファのサイズを制御するには、次のプロパティを設定します。

oracle.hadoop.loader.output.dirpathBufsize

3.9.3 デリミタ付きテキスト出力形式

Hadoopクラスタでデリミタ付きテキスト出力ファイルを作成できます。マップまたはリデュース・タスクは、ジョブ構成ファイルに指定されたフィールド・デリミタと囲み文字を使用して、デリミタ付きテキスト・ファイルを生成します。後で、このデータを個別のプロシージャとしてOracleデータベースにロードできます。「DelimitedTextOutputFormatの概要」を参照してください。

この出力形式では、オンライン・データベース・モードの場合には、Oracle Databaseシステムへのオープン状態の接続で表のメタデータを取得し、オフライン・データベース・モードの場合には、OraloaderMetadataユーティリティによって生成された表のメタデータ・ファイルを使用できます。

この出力形式を使用するには、mapreduce.job.outputformat.classを次のように設定します

oracle.hadoop.loader.lib.output.DelimitedTextOutputFormat

3.9.3.1 DelimitedTextOutputFormatの概要

出力タスクによって、デリミタ付きテキスト形式ファイル、1つ以上の対応するSQL*Loader制御ファイルおよび外部表を使用してロードするためのSQLスクリプトが生成されます。

ターゲット表がパーティション化されていない場合、またはoracle.hadoop.loader.loadByPartitionがfalseの場合には、DelimitedTextOutputFormatによって次のファイルが生成されます。

- データ・ファイル: oraloader-taskId-csv-0.dat

- ジョブ全体のSQL*Loader制御ファイル: oraloader-csv.ctl

- デリミタ付きテキスト・ファイルをターゲット表にロードするSQLスクリプト: oraloader-csv.sql

パーティション化された表の場合、複数の出力ファイルが作成されます。各ファイルの名前は次のとおりです。

- データ・ファイル: oraloader-taskId-csv-partitionId.dat

- SQL*Loader制御ファイル: oraloader-taskId-csv-partitionId.ctl

- SQLスクリプト: oraloader-csv.sql

生成されたファイル名のtaskIdはマッパー(リデューサ)識別子を表し、partitionIdはパーティション識別子を表します。

HadoopクラスタがOracle Databaseシステムに接続している場合、Oracle SQL Connector for HDFSを使用してデリミタ付きテキスト・データをOracleデータベースにロードできます。「Oracle SQL Connector for Hadoop Distributed File System」を参照してください。

または、デリミタ付きテキスト・ファイルをデータベース・システムにコピーして、次のいずれかの方法でデータをターゲット表にロードすることもできます。

- 生成された制御ファイルを使用してSQL*Loaderを実行し、デリミタ付きテキスト・ファイルからデータをロードします。

- 生成されたSQLスクリプトを使用して、外部表をロードします。

ファイルは${mapreduce.output.fileoutputformat.outputdir}/_olhディレクトリにあります。

3.9.3.2 構成プロパティ

出力ファイル内のレコードとフィールドの形式は、次のプロパティによって制御されます。

- oracle.hadoop.loader.output.escapeEnclosers

- oracle.hadoop.loader.output.fieldTerminator

- oracle.hadoop.loader.output.initialFieldEncloser

- oracle.hadoop.loader.output.trailingFieldEncloser

例3-4に、出力タスクで生成されるサンプルSQL*Loader制御ファイルを示します。

例3-4 サンプルSQL*Loader制御ファイル

LOAD DATA CHARACTERSET AL32UTF8
INFILE 'oraloader-csv-1-0.dat'
BADFILE 'oraloader-csv-1-0.bad'
DISCARDFILE 'oraloader-csv-1-0.dsc'
INTO TABLE "SCOTT"."CSV_PART" PARTITION(10) APPEND
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
"ID"      DECIMAL EXTERNAL,
"NAME"    CHAR,
"DOB"     DATE 'SYYYY-MM-DD HH24:MI:SS'
)

3.9.4 Oracle Data Pump出力形式

Hadoopクラスタでデータ・ポンプ形式ファイルを作成できます。データ・ポンプ・ファイルは、マップまたはリデュース・タスクによって生成されます。後で、このデータを個別のプロシージャとしてOracleデータベースにロードできます。「DataPumpOutputFormatの概要」を参照してください。

この出力形式では、オンライン・データベース・モードの場合には、Oracle Databaseシステムへのオープン状態の接続を使用し、オフライン・データベース・モードの場合には、OraloaderMetadataユーティリティによって生成された表のメタデータ・ファイルを使用できます。

この出力形式を使用するには、mapreduce.job.outputformat.classを次のように設定します

oracle.hadoop.loader.lib.output.DataPumpOutputFormat

3.9.4.1 DataPumpOutputFormatの概要

DataPumpOutputFormatは、データ・ファイルを生成し、次の形式でファイル名を付けます。

oraloader-taskId-dp-partitionId.dat

生成されたファイル名のtaskIdはマッパー(リデューサ)識別子を表し、partitionIdはパーティション識別子を表します。

HadoopクラスタがOracle Databaseシステムに接続している場合、Oracle SQL Connector for HDFSを使用してデータ・ポンプ・ファイルをOracleデータベースにロードできます。「Oracle SQL Connector for Hadoop Distributed File System」を参照してください。

または、データ・ポンプ・ファイルをデータベース・システムにコピーし、Oracle Loader for Hadoopによって生成されたSQLスクリプトを使用してロードすることもできます。このスクリプトは次のタスクを実行します。

1. ORACLE_DATAPUMPアクセス・ドライバを使用する外部表定義を作成します。バイナリ形式のOracle Data Pump出力ファイルは、外部表のLOCATION句にリストされます。

2. 外部表によって使用されるディレクトリ・オブジェクトを作成します。スクリプトを実行する前に、このコマンドのコメントを解除する必要があります。スクリプトで使用するディレクトリ名を指定するには、ジョブ構成ファイルにoracle.hadoop.loader.extTabDirectoryNameプロパティを設定します。

3. 外部表からターゲット表に行を挿入します。スクリプトを実行する前に、このコマンドのコメントを解除する必要があります。

SQLスクリプトは${mapreduce.output.fileoutputformat.outputdir}/_olhディレクトリにあります。

関連項目:

- 外部表の作成と管理の詳細は、『Oracle Database管理者ガイド』

- ORACLE_DATAPUMPアクセス・ドライバの詳細は、『Oracle Databaseユーティリティ』

3.10 ローダー・ジョブの実行

Oracle Loader for Hadoopでジョブを実行するには、hadoopコマンドのOraLoaderユーティリティを使用します。

基本的な構文は次のとおりです。

hadoop jar $OLH_HOME/jlib/oraloader.jar oracle.hadoop.loader.OraLoader \
-conf job_config.xml \
-libjars input_file_format1.jar[,input_file_format2.jar...]

任意の汎用的なhadoopコマンドライン・オプションを指定できます。OraLoaderは、org.apache.hadoop.util.Toolインタフェースを実装し、MapReduceアプリケーションを構築する標準的なHadoopの方法に従います。

基本オプション

-conf job_config.xml

ジョブ構成ファイルを識別します。「ジョブ構成ファイルの作成」を参照してください。

-libjars

入力形式としてJARファイルを識別します。

- サンプル入力形式を使用する場合は、$OLH_HOME/jlib/oraloader-examples.jarを指定します。

- HiveまたはOracle NoSQL Databaseの入力形式を使用する場合は、この項で後述する追加JARファイルを指定する必要があります。

- カスタム入力形式を使用する場合は、JARを指定します(HADOOP_CLASSPATHにも忘れずに追加してください)。

複数のファイル名をカンマで区切り、各ファイル名を明示的にリストします。ワイルドカード文字および空白は使用できません。

Oracle Loader for Hadoopは、MapReduceタスク用に内部構成情報を準備します。また、表のメタデータ情報と従属するJavaライブラリを分散キャッシュに格納して、クラスタ全体でMapReduceタスクに使用できるようにします。

OraLoaderの起動例

次の例では、組込み入力形式を使用し、ジョブ構成ファイルの名前をMyConf.xmlとしています。

HADOOP_CLASSPATH="$OLH_HOME/jlib/*:$HADOOP_CLASSPATH"

hadoop jar $OLH_HOME/jlib/oraloader.jar oracle.hadoop.loader.OraLoader \
-conf MyConf.xml -libjars $OLH_HOME/jlib/oraloader-examples.jar

関連項目:

- hadoopコマンドの完全な構文および汎用オプションついては、次のサイトを参照してください。
http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/CommandsManual.html

3.10.1 Hive入力形式のJARファイルの指定

HiveToAvroInputFormatを使用する場合は、Hive構成ディレクトリをHADOOP_CLASSPATH環境変数に追加する必要があります。

HADOOP_CLASSPATH="$OLH_HOME/jlib/*:hive_home/lib/*:hive_conf_dir:$HADOOP_CLASSPATH"

次のHive JARファイルを、カンマ区切りリスト形式で、hadoopコマンドの-libjarsオプションに追加する必要もあります。アスタリスク(*)を完全なファイル名に置き換えます。

- hive-exec-*.jar

- hive-metastore-*.jar

- libfb303*.jar

次の例は、Cloudera's Distribution including Apache Hadoop (CDH) 4.4の完全なファイル名を示しています。

# hadoop jar $OLH_HOME/jlib/oraloader.jar oracle.hadoop.loader.OraLoader \
-conf MyConf.xml \
-libjars hive-exec-0.10.0-cdh4.4.0.jar,hive-metastore-0.10.0-cdh4.4.0.jar,libfb303-0.9.0.jar

3.10.2 Oracle NoSQL Database入力形式のJARファイルの指定

Oracle NoSQL Database 11gリリース2のKVAvroInputFormatを使用する場合、HADOOP_CLASSPATHに$KVHOME/lib/kvstore.jarを含め、hadoopコマンドに-libjarsオプションを含める必要があります。

hadoop jar $OLH_HOME/jlib/oraloader.jar oracle.hadoop.loader.OraLoader \
-conf MyConf.xml \
-libjars $KVHOME/lib/kvstore.jar

3.10.3 ジョブのレポート作成

Oracle Loader for Hadoopは、個々のタスクからのレポート情報をまとめて${mapreduce.output.fileoutputformat.outputdir}/_olh/oraloader-report.txtファイルを作成します。このレポートには、その他の統計とともに、各マッパーおよびリデューサのタイプとタスク別に分類されたエラーの数が表示されます。

3.11 拒否されたレコードの処理

Oracle Loader for Hadoopは、次のような様々な理由で入力レコードを拒否します。

- マッピング・プロパティのエラー

- 入力データ内の欠落フィールド

- 無効な表パーティションにマップされたレコード

- 不正な書式のレコード(たとえば、日付が日付形式に一致しない場合や、レコードが正規表現パターンに一致しない場合)

3.11.1 拒否されたレコードの不正なファイルへのロギング

デフォルトでは、Oracle Loader for Hadoopは、拒否されたレコードをHadoopログに記録せず、拒否されたレコードの識別方法のみを記録します。これにより、クラスタ全体に存在するHadoopログにユーザーの機密情報が格納されることを防ぎます。

拒否されたレコードを記録するようにOracle Loader for Hadoopを管理するには、構成プロパティoracle.hadoop.loader.logBadRecordsをtrueに設定します。Oracle Loader for Hadoopは、ジョブの出力ディレクトリ内にある_olh/ディレクトリの1つ以上の「不正な」ファイルに不正なレコードを記録します。

3.11.2 ジョブの拒否制限の設定

一部の問題により、Oracle Loader for Hadoopが入力のすべてのレコードを拒否することがあります。このような問題による時間とリソースの無駄を軽減するため、Oracle Loader for Hadoopは、1000レコードが拒否されると、ジョブを中止します。

拒否レコードの最大許可数を変更するには、構成プロパティoracle.hadoop.loader.rejectLimitを設定します。負の値を設定すると、拒否制限が無効になり、拒否されるレコードの数に関係なくジョブの実行が完了します。

3.12 パーティション化表にデータをロードする場合のロード・バランシング

ロード・バランシングの目標は、すべてのリデューサにほぼ同量の処理を割り当てるMapReduceパーティション化スキームを生成することです。

Oracle Loader for Hadoopのサンプリング機能を使用すると、パーティション化されたデータベース表にデータをロードするときにリデューサ間で負荷を分散できます。このサンプリング機能では、データベース・パーティションをリデューサに割り当てる効率的なMapReduceパーティション化スキームが生成されます。

リデューサの実行時間は、通常、処理するレコードの数に比例します。レコードが多いほど、実行時間は長くなります。サンプリング機能が無効の場合、特定のデータベース・パーティションのすべてのレコードが1つのリデューサに送られます。データベース・パーティションによってレコードの数が異なることがあるため、これによってリデューサの負荷は不均等になります。Hadoopジョブの実行時間は、通常、最も遅いリデューサの実行時間によって決まるため、リデューサの負荷が不均等な場合、ジョブ全体のパフォーマンスが低下します。

3.12.1 サンプリング機能の使用方法

サンプリング機能の有効/無効を切り替えるには、構成プロパティoracle.hadoop.loader.sampler.enableSamplingを設定します。サンプリング機能はデフォルトで有効になっています。

3.12.2 ロード・バランシングのチューニング

次のジョブ構成プロパティによってロード・バランシング機能の質を制御します。

- oracle.hadoop.loader.sampler.maxLoadFactor

- oracle.hadoop.loader.sampler.loadCI

サンプラは、所定のリデューサ負荷係数を使用してパーティション化スキームの質を評価します。負荷係数は、(assigned_load - ideal_load)/ideal_loadの計算で求められる各リデューサの相対的な過負荷を表します。このメトリックは、リデューサの負荷が、完全に分散されたリデューサの負荷とどの程度違っているかを示します。負荷係数1.0は、完全に分散された負荷(過負荷ではない)を表します。

負荷係数が小さい場合、負荷分散が適切であることを表します。maxLoadFactorのデフォルト0.05は、5%以上の過負荷状態になるリデューサがないことを表します。サンプラでは、loadCIの値で決まる統計的信頼度でこのmaxLoadFactorが保証されます。loadCIのデフォルト値は0.95で、maxLoadFactorを超えるリデューサの負荷係数は5%のみであることを表します。

サンプラの実行時間と負荷分散の質の間にはトレードオフがあります。maxLoadFactorの値を低くしてloadCIの値を高くすると、リデューサの負荷はより均等化されますが、サンプリング時間は長くなります。maxLoadFactor=0.05およびloadCI=0.95というデフォルト値では、負荷分散の質と実行時間の兼合いが適切にとられます。

3.12.3 サンプリング動作のチューニング

デフォルトでは、サンプラは、maxLoadFactorとloadCIの基準を満たすパーティション化スキームを生成するのに十分なサンプルを収集するまで実行されます。

ただし、サンプリングする最大レコード数を指定するoracle.hadoop.loader.sampler.maxSamplesPctプロパティを設定すると、サンプラの実行時間を制限できます。

3.12.4 Oracle Loader for Hadoopがサンプラのパーティション化スキームを使用するのはどのような場合か

Oracle Loader for Hadoopでは、サンプリングが成功の場合にのみ、生成されたパーティション化スキームを使用します。統計的信頼度loadCIで保証される最大リデューサ負荷係数(1+ maxLoadFactor)のパーティション化スキームが生成される場合、サンプリングは成功です。

パーティション・レポートは、様々なマッパーに割り当てられたキーを識別します。このレポートは、サンプラで使用するためのXML形式で保存されます。ユーザーが使用するための情報は含まれません。このレポートには、${mapreduce.output.fileoutputformat.outputdir}/_balancer/orabalancer_report.xmlという名前が付けられます。サンプル化されたジョブ専用に生成されます。このxmlファイルには、マッピング出力を異なるリデューサに割り当てる方法およびサンプリング統計の説明が含まれます。

デフォルト値maxLoadFactor、loadCIおよびmaxSamplesPctにより、サンプラは、様々な入力データ分布に対する質の高いパーティション化スキームを正常に生成できます。ただし、制約が厳しすぎる場合や、必要なサンプルの数が、ユーザーが指定した最大数であるmaxSamplesPctを超えている場合などには、サンプラがカスタム・プロパティ値を使用したパーティション化スキームの生成に失敗することがあります。このような場合、Oracle Loader for Hadoopは、問題を特定するログ・メッセージを生成し、データベースのパーティション化スキームを使用してレコードの分割を行い、負荷分散は保証されません。

代替策は、構成プロパティの値を緩和することです。これは、maxSamplesPctを大きくするか、maxLoadFactorまたはloadCI、あるいはその両方を小さくすることによって行えます。

3.12.5 メモリーの問題の解決

カスタム入力形式では、メモリーに収まらない入力分割が返されることがあります。このような場合、サンプラは、ローダー・ジョブが発行されるクライアント・ノードでメモリー不足エラーを返します。

この問題の解決策は、次のとおりです。

- ジョブが発行されるJVMのヒープ・サイズを大きくします。

- 次のプロパティを調整します。

- oracle.hadoop.loader.sampler.hintMaxSplitSize

- oracle.hadoop.loader.sampler.hintNumMapTasks

カスタム入力形式を開発する場合は、「カスタム入力形式」を参照してください。

3.12.6 サンプリング機能のプロパティの値が無効な場合

サンプリング機能の構成プロパティが、許容可能な範囲外の値に設定されている場合、例外は返されません。かわりに、サンプラは警告メッセージを出力し、プロパティをデフォルト値に設定して実行を続けます。

3.13 Oracleエンジニアド・システム間の通信の最適化

Oracle Loader for Hadoopを使用してデータをOracle Big Data ApplianceからOracle Exadata Database Machineにロードする場合、InfiniBandプライベート・ネットワーク上でSockets Direct Protocol (SDP)を使用するようにシステムを構成することによって、スループットを向上させることができます。この設定は、データのロードのみを目的としてOracle Databaseに接続するための追加接続属性を指定します。

SDPプロトコルを指定するには、次のようにします。

1. HADOOP_OPTS環境変数にJVMオプションを追加して、JDBC SDPエクスポートを有効にします。

HADOOP_OPTS="-Doracle.net.SDP=true -Djava.net.preferIPv4Stack=true"

2. 次のようにして、このHadoop構成プロパティを子タスクJVMに設定します。

-D mapred.child.java.opts="-Doracle.net.SDP=true -Djava.net.preferIPv4Stack=true"

注意:

このHadoop構成プロパティは、OLHコマンドラインに追加したり、構成ファイルに設定したりできます。

3. 標準のイーサネット通信を構成します。ジョブ構成ファイルで、次の構文に従ってoracle.hadoop.loader.connection.urlを設定します。

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=hostName)(PORT=portNumber)))
(CONNECT_DATA=(SERVICE_NAME=serviceName)))

4. ExadataでOracleリスナーを、SDPプロトコルをサポートするように構成し、特定のポート・アドレス(1522など)にバインドします。ジョブ構成ファイルで、次の構文に従ってoracle.hadoop.loader.connection.oci_urlの値としてリスナー・アドレスを指定します。

(DESCRIPTION=(ADDRESS=(PROTOCOL=SDP)
(HOST=hostName) (PORT=portNumber))
(CONNECT_DATA=(SERVICE_NAME=serviceName)))

hostName、portNumberおよびserviceNameは、Oracle Exadata Database Machine上のSDPリスナーを識別するための適切な値に置き換えます。

関連項目:

InfiniBandによる通信の構成の詳細は、『Oracle Big Data Applianceソフトウェア・ユーザーズ・ガイド』を参照してください。

3.14 Oracle Loader for Hadoop構成プロパティ・リファレンス

OraLoaderは、構成プロパティの指定にhadoopコマンドの標準的なメソッドを使用します。構成ファイルを指定する場合は-confオプションを使用し、個別のプロパティを指定する場合は-Dオプションを使用します。「ローダー・ジョブの実行」を参照してください。

この項では、一般にOraLoaderジョブに設定する必要があるOraLoader構成プロパティ、Oracle NoSQL Database構成プロパティ、そしていくつかの汎用的なHadoop MapReduceプロパティについて説明します。

- MapReduce構成プロパティ

- OraLoaderの構成プロパティ

- Oracle NoSQL Databaseの構成プロパティ

すべてのOraLoaderプロパティを示す構成ファイルは、$OLH_HOME/doc/oraloader-conf.xmlにあります。

関連項目:

ジョブ構成ファイルに関するHadoopのドキュメント

http://wiki.apache.org/hadoop/JobConfFile

MapReduce構成プロパティ

プロパティ

説明

mapreduce.job.name

型: String

デフォルト値: OraLoader

説明: Hadoopのジョブ名。一意の名前を付けることで、Hadoop JobTracker WebインタフェースやCloudera Managerなどのツールを使用してジョブを監視できます。

mapreduce.input.fileinputformat.inputdir

型: String

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

説明: 入力ディレクトリの名前のカンマ区切りリスト。

mapreduce.job.inputformat.class

型: String

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

説明: 入力データの形式を識別します。次のいずれかの組込み入力形式またはカスタムInputFormatクラスの名前を入力できます。

- oracle.hadoop.loader.lib.input.AvroInputFormat

- oracle.hadoop.loader.lib.input.DelimitedTextInputFormat

- oracle.hadoop.loader.lib.input.HiveToAvroInputFormat

- oracle.hadoop.loader.lib.input.RegexInputFormat

- oracle.kv.hadoop.KVAvroInputFormat

組込み入力形式の詳細は、「入力形式の概要」を参照してください。

mapreduce.output.fileoutputformat.outputdir

型: String

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

説明: 出力ディレクトリのカンマ区切りリスト。ジョブを実行する前には存在しません。必須。

mapreduce.job.outputformat.class

型: String

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

説明: 出力タイプを指定します。値は次のとおりです。

- oracle.hadoop.loader.lib.output.DataPumpOutputFormat
外部表を使用してターゲット表にロードされるバイナリ形式ファイルにデータ・レコードを書き込みます。

- oracle.hadoop.loader.lib.output.DelimitedTextOutputFormat
データ・レコードを、カンマ区切り(CSV)形式ファイルなどのデリミタ付きテキスト形式ファイルに書き込みます。

- oracle.hadoop.loader.lib.output.JDBCOutputFormat
JDBC接続を使用して行をターゲット表に挿入します。

- oracle.hadoop.loader.lib.output.OCIOutputFormat
Oracle OCIダイレクト・パス・インタフェースを使用して、行をターゲット表に挿入します。

「出力形式の概要」を参照してください。

mapreduce.job.reduces

型: Integer

デフォルト値: 1

説明: Oracle Loader for Hadoopジョブで使用されるリデュース・タスクの数。デフォルト値の1ではパラレル処理がサポートされないため、複数のパラレル・データ・ロードをサポートするよう値を大きくすると、パフォーマンスが向上します。ジョブのリデュース・タスクの数には、十分であるが過剰でない値を選択してください。使用可能なリソースによって決定されるポイントでリデュース・タスクの数を過度に増やすと、向上がみられなくなる一方で、他のジョブのパフォーマンスが低下する可能性もあります。

OraLoaderの構成プロパティ

プロパティ

説明

oracle.hadoop.loader.badRecordFlushInterval

型: Integer

デフォルト値: 500

説明: ログ・ファイルをフラッシュするまでにタスクの試行を記録できる最大レコード数を設定します。この設定により、レコードの拒否が制限(oracle.hadoop.loader.rejectLimit)に達し、ジョブの実行が停止した場合に失われる可能性があるレコード数が制限されます。

フラッシュ間隔を有効にするには、oracle.hadoop.loader.logBadRecordsプロパティをtrueに設定する必要があります。

oracle.hadoop.loader.compressionFactors

型: 小数

デフォルト値: BASIC=5.0,OLTP=5.0,QUERY_LOW=10.0,QUERY_HIGH=10.0,ARCHIVE_LOW=10.0,ARCHIVE_HIGH=10.0

説明: これらの値は、サンプリングが有効でターゲット表が圧縮されているときにOracle Loader for Hadoopによって使用されます。これらは、ターゲット表の圧縮係数です。最高のパフォーマンスを得るには、このプロパティの値がターゲット表の圧縮係数と一致している必要があります。値は名前=値のペアのカンマ区切りリストです。名前は次のキーワードのいずれかである必要があります。

ARCHIVE_HIGH

ARCHIVE_LOW

BASIC

OLTP

QUERY_HIGH

QUERY_LOW

oracle.hadoop.loader.connection.defaultExecuteBatch

型: Integer

デフォルト値: 100

説明: データベースへのトリップごとに挿入されるレコード数。JDBCOutputFormatおよびOCIOutputFormatにのみ適用されます。

1以上の値を指定します。最大値の制限はありませんが、パフォーマンスはあまり向上せずにメモリー・フットプリントが大きくなるため、非常に大きいバッチ・サイズを使用することは推奨されません。

値が1未満の場合は、デフォルト値が設定されます。

oracle.hadoop.loader.connection.oci_url

型: String

デフォルト値: oracle.hadoop.loader.connection.urlの値

説明: OCIOutputFormatで使用されるデータベース接続文字列。このプロパティを指定することによって、JDBC接続URLとは異なる接続パラメータを使用してOCIクライアントからデータベースに接続できます。

次の例では、OCI接続にソケット・ダイレクト・プロトコル(SDP)を指定しています。

(DESCRIPTION=(ADDRESS_LIST=

(ADDRESS=(PROTOCOL=SDP)(HOST=myhost)(PORT=1521)))

(CONNECT_DATA=(SERVICE_NAME=my_db_service_name)))

この接続文字列に接頭辞"jdbc:oracle:thin:@"は不要です。最初のアット記号(@)までのすべての文字が削除されます。

oracle.hadoop.loader.connection.password

型: String

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

説明: 接続するユーザーのパスワード。パスワードの保存にはクリア・テキストを使用しないことをお薦めします。かわりにOracle Walletを使用してください。

oracle.hadoop.loader.connection.sessionTimeZone

型: String

デフォルト値: LOCAL

説明: データベース接続のセッション・タイムゾーンを変更します。有効な値は、次のとおりです。

- [+|-]hh:mm: 協定世界時(UTC)との差分を表す時間数と分数(例: 東部標準時の場合は-5:00)

- LOCAL: JVMのデフォルト・タイムゾーン

- time_zone_region: 有効なJVMタイムゾーン・リージョン(東部標準時を表すESTやAmerica/New_Yorkなど)

このプロパティは、TIMESTAMP WITH TIME ZONEおよびTIMESTAMP WITH LOCAL TIME ZONEのデータベース列タイプにロードされる入力データに使用されるデフォルト・タイムゾーンも決定します。

oracle.hadoop.loader.connection.cluster.tns_admin

型: String

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

説明: クライアント側のTNS管理者のロケーションと異なる場合の、クラスタ・ノード上のTNS管理者のロケーション。

デフォルトでは、クライアント側のTNS管理者のロケーションは、クラスタ・ノード上のロケーションと同じで、oracle.hadoop.loader.connection.tns_adminにより指定します。

oracle.hadoop.loader.connection.tns_adminが指定されていない場合、このプロパティの指定は無効です。

oracle.hadoop.loader.connection.tns_admin

型: String

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

説明: Hadoopクラスタの各ノードにある、sqlnet.oraやtnsnames.oraなどのSQL*Net構成ファイルが含まれるディレクトリへのファイル・パス。データベース接続文字列でTNSエントリ名を使用できるようにこのプロパティを設定します。

Oracle Walletを外部パスワード・ストアとして使用する場合(推奨)、このプロパティを設定する必要があります。「oracle.hadoop.loader.connection.wallet_location」を参照してください。

oracle.hadoop.loader.connection.tnsEntryName

型: String

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

説明: tnsnames.oraファイルに定義されたTNSエントリ名。このプロパティは、oracle.hadoop.loader.connection.tns_adminとともに使用します。

oracle.hadoop.loader.connection.url

型: String

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

説明: データベース接続のURL。このプロパティは、他のすべての接続プロパティより優先されます。

Oracle Walletが外部パスワード・ストアとして構成されている場合(推奨)、プロパティ値は、ドライバ接頭辞jdbc:oracle:thin:@で始まる必要があり、データベース接続文字列は、ウォレットに格納されている資格証明と完全に一致する必要があります。「oracle.hadoop.loader.connection.wallet_location」を参照してください。

次の例に、接続URLの有効な値を示します。

- Oracle Net形式:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=myhost)(PORT=1521)))
(CONNECT_DATA=(SERVICE_NAME=example_service_name)))

- TNSエントリ形式:

jdbc:oracle:thin:@myTNSEntryName

- Thinスタイル:

jdbc:oracle:thin:@//myhost:1521/my_db_service_name

oracle.hadoop.loader.connection.user

型: String

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

説明: データベース・ユーザー名。このプロパティではoracle.hadoop.loader.connection.passwordも設定する必要があります。ただし、パスワードの格納にはOracleウォレットを使用することをお薦めします。クリア・テキスト形式では格納しないでください。

オンライン・データベース・モードを使用する場合は、このプロパティまたはoracle.hadoop.loader.connection.wallet_locationを設定する必要があります。

oracle.hadoop.loader.connection.wallet_location

型: String

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

説明: Hadoopクラスタの各ノードにある、接続資格証明が格納されているOracle Walletディレクトリへのファイル・パス。

Oracle Walletを使用する場合、次のプロパティも設定する必要があります。

- oracle.hadoop.loader.connection.tns_admin

- oracle.hadoop.loader.connection.urlまたはoracle.hadoop.loader.connection.tnsEntryName

oracle.hadoop.loader.connection.cluster.wallet_location

型: String

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

説明: クライアント側のウォレットのロケーションと異なる場合の、クラスタ・ノード上のウォレットのロケーション。

デフォルトでは、クライアント側のウォレットのロケーションは、クラスタ・ノード上のウォレットのロケーションと同じで、oracle.hadoop.loader.connection.wallet_locationにより指定します。

oracle.hadoop.loader.connection.wallet_locationが指定されていない場合、このプロパティの指定は無効です。

oracle.hadoop.loader.defaultDateFormat

型: String

デフォルト値: yyyy-MM-dd HH:mm:ss

説明: java.text.SimpleDateformatパターンとデフォルトのロケールを使用して、入力フィールドをDATE列に解析します。入力ファイルのフィールドごとに異なるパターンが必要な場合は、手動マッピング・プロパティを使用します。「手動マッピング」を参照してください。

oracle.hadoop.loader.enableSorting

型: Boolean

デフォルト値: true

説明: 各リデューサ・グループ内の出力レコードをソートするかどうかを制御します。ターゲット表のソート・キーとなる列を指定するには、oracle.hadoop.loader.sortKeyプロパティを使用します。このプロパティを指定しなければ、レコードは主キーでソートされます。

oracle.hadoop.loader.extTabDirectoryName

型: String

デフォルト値: OLH_EXTTAB_DIR

説明: 外部表のLOCATIONデータ・ファイルのデータベース・ディレクトリ・オブジェクトの名前。Oracle Loader for Hadoopがこのディレクトリにデータ・ファイルをコピーするのではなく、外部表のDDLを格納しているSQLファイルがファイル出力形式によって生成され、このファイルにディレクトリ名が記録されます。

このプロパティはDelimitedTextOutputFormatおよびDataPumpOutputFormatのみに適用されます。

oracle.hadoop.loader.input.fieldNames

型: String

デフォルト値: F0,F1,F2,...

説明: 入力フィールドの名前のカンマ区切りリスト。

組込み入力形式の場合は、目的のフィールドだけではなく、データ内のすべてのフィールドの名前を指定します。入力行のフィールド数がこのプロパティに指定されたフィールド名の数より多い場合、余分なフィールドは破棄されます。行のフィールド数がこのプロパティに指定されたフィールド名の数より少ない場合、余分なフィールドにはnullが設定されます。選択したフィールドのみをロードする場合は、「ターゲット表列への入力フィールドのマッピング」を参照してください。

名前は、レコードのAvroスキーマの作成に使用されるため、有効なJSON名文字列である必要があります。

oracle.hadoop.loader.input.fieldTerminator

型: String

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

説明: DelimitedTextInputFormatの入力フィールドの終了を示す文字。値には、1文字または\uHHHH (HHHHは文字のUTF-16エンコーディング)を指定できます。

oracle.hadoop.loader.input.hive.databaseName

型: String

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

説明: 入力表が格納されているHiveデータベースの名前

oracle.hadoop.loader.input.hive.partitionFilter

注意:
このプロパティは非推奨です。かわりにoracle.hadoop.loader.input.hive.rowFilterを使用してください。

型: String

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

説明: HiveToAvroInputFormatのソースHive表パーティションをフィルタするのに使用される有効なHiveQL式。式にはパーティション列のみを含む必要があります。他の列を含めてもエラーは発生しませんが、意図しない結果となる可能性があります。他の列は含めないことをお薦めします。値が設定されていない場合、Oracle Loader for HadoopはソースHive表のすべてのパーティションからデータをロードします。表がパーティション化されていない場合、このプロパティは無視されます。これは、oracle.hadoop.loader.input.hive.rowFilterが設定されている場合は無視されます。

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

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

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

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

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

- すべての変数の拡張をHadoopレベルで解決します。Hive変数ネームスペース(env:、system:、hiveconf:およびhivevar:など)に意味はありません。Oracle Loader for Hadoopはhive.variable.substituteをfalseに設定し、これによりHive変数の拡張は無効になります。次の拡張方法の中から選択できます。
すべての変数を拡張してから、このプロパティを設定します。Hive CLIでは、次のコマンドを使用します。

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

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

Oracle Loader for Hadoopにあるすべての変数を定義します。Oracle Loader for 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.loader.input.hive.rowFilter

型: String

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

説明: HiveToAvroInputFormatのソースHive表の行をフィルタするために使用される有効なHiveQL式。この値が設定されていない場合(デフォルト)、Oracle Loader for Hadoopはoracle.hadoop.loader.input.hive.partitionFilterの値の使用を試みます(表がパーティション化されている場合)。それ以外の場合は、Oracle Loader for HadoopはソースHive表全体をロードします。

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

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

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

- すべての変数の拡張をHadoopレベルで解決します。Hive変数ネームスペース(env:、system:、hiveconf:およびhivevar:など)に意味はありません。Oracle Loader for Hadoopはhive.variable.substituteをfalseに設定し、これによりHive変数の拡張は無効になります。次の拡張方法の中から選択できます。

- すべての変数を拡張してから、このプロパティを設定します。Hive CLIでは、次のコマンドを使用します。

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

「View Original Text」フィールドには、すべての変数が拡張された問合せが含まれます。WHERE句にある式をコピーします。(WHEREキーワード自体は含めないでください。)

- Oracle Loader for Hadoopですべての変数を定義します。Oracle Loader for Hadoopを実行するためのHadoopコマンドで、汎用オプション(-Dおよび-conf)を使用します。

いずれの場合も、Hive CLIを使用して式をテストし、期待される結果が返されることを確認できます。次の例では、このコマンドでソース表が定義されていることを前提としています。

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

例#1: ネストされた式

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

例 #2: 組込み関数

year(p5) = 2013)

Oracleでは、ネイティブHive表(ストレージ・ハンドラによって管理されない表)から行のサブセットをインポートするときにはhive.optimize.index.filterをオンにすることをお薦めします。これはORCおよびPARQUETなどの入力形式に役立つと知られていますが、いくつかの注意点があります。

- このプロパティは、-Dを使用して設定する必要があります(-confを使用しても機能しません)。または、このプロパティをhive-site.xmlで設定することもできます。

- これは、Hive 0.12のORC表の場合に機能します。

oracle.hadoop.loader.input.hive.tableName

型: String

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

説明: 入力データが格納されているHive表の名前。

oracle.hadoop.loader.input.initialFieldEncloser

型: String

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

説明: フィールドの開始を示す文字。値には、1文字または\uHHHH (HHHHは文字のUTF-16エンコーディング)を指定できます。デフォルト設定(囲み文字なし)に戻すには、長さが0の値を入力します。フィールドの囲み文字には、入力形式に定義された終端文字および空白文字とは異なる文字を使用する必要があります。

このプロパティが設定されている場合、パーサーは、各フィールドを囲まれていないトークン(値)として読み取る前にまず、囲まれたトークンとして読み取ります。フィールド囲み文字が設定されていない場合、パーサーは各フィールドを囲まれていないトークンとして読み取ります。

このプロパティを設定し、oracle.hadoop.loader.input.trailingFieldEncloserを設定していない場合は、両方のプロパティに同じ値が使用されます。

oracle.hadoop.loader.input.regexCaseInsensitive

型: Boolean

デフォルト値: false

説明: パターンの照合時に大文字と小文字を区別するかどうかを制御します。trueに設定すると、大文字と小文字の違いは無視され、"string"は"String"、"STRING"、"string"、"StRiNg"などと一致します。デフォルトでは、"string"は"string"のみと一致します。

このプロパティはorg.apache.hadoop.hive.contrib.serde2.RegexSerDeのinput.regex.case.insensitiveプロパティと同じです。

oracle.hadoop.loader.input.regexPattern

型: テキスト

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

説明: 正規表現のパターン文字列

正規表現はテキスト行全体が一致する必要があります。たとえば、入力行"a,b,c,"の正しい正規表現パターンは"([^,]*),([^,]*),([^,]*),"ですが、"([^,]*),"は無効です。その理由は、この表現は入力テキストの行に反復して適用されていないためです。

RegexInputFormatでは、正規表現の一致による取得グループをフィールドとして使用します。特殊なグループのゼロは、入力行全体を表すため無視されます。

このプロパティはorg.apache.hadoop.hive.contrib.serde2.RegexSerDeのinput.regexプロパティと同じです。

関連項目:

正規表現と取得グループの詳細は、次のサイトにあるJava Platform Standard Edition 6 API仕様のjava.util.regexのエントリを参照してください。

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

oracle.hadoop.loader.input.trailingFieldEncloser

型: String

デフォルト値: oracle.hadoop.loader.input.initialFieldEncloserの値

説明: フィールドの終了を示す文字を表します。値には、1文字または\uHHHH (HHHHは文字のUTF-16エンコーディング)を指定できます。終了囲み文字がない場合は、長さが0の値を入力します。

フィールドの囲み文字には、入力形式に定義された終端文字および空白文字とは異なる文字を使用する必要があります。

終了フィールド囲み文字が入力フィールドに組み込まれている場合、リテラル・テキストとして解析されるようにするには、二重にする必要があります。たとえば、'(1つの単一引用符)をロードするには、入力フィールドに''(2つの単一引用符)を指定する必要があります。

このプロパティを設定する場合、oracle.hadoop.loader.input.initialFieldEncloserも設定する必要があります。

oracle.hadoop.loader.loadByPartition

型: Boolean

デフォルト値: true

説明: パーティションを認識するロードを指定します。Oracle Loader for Hadoopは、Hadoopクラスタ上のすべての出力形式の出力をパーティション別に整理します。このタスクはデータベース・システムのリソースには影響しません。

DelimitedTextOutputFormatおよびDataPumpOutputFormatでは複数のファイルが生成され、各ファイルに1つのパーティションのレコードが格納されます。DelimitedTextOutputFormatでは、このプロパティによって、SQL*Loader用に生成された制御ファイルにPARTITIONキーワードを含めるかどうかも制御されます。

OCIOutputFormatにはパーティション化表が必要です。このプロパティをfalseに設定すると、OCIOutputFormatが有効になります。その他の出力形式では、loadByPartitionをfalseに設定すると、Oracle Loader for Hadoopはパーティション化表がパーティション化されていない表と同様に処理されます。

oracle.hadoop.loader.loaderMap.columnNames

型: String

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

説明: ターゲット表の列名を任意の順序で示したカンマ区切りリスト。名前は引用符で囲むか囲まないかのいずれかです。引用符で囲む名前には二重引用符(")を最初と最後に付けることで、入力したとおりに使用されます。引用符で囲まれていない名前は大文字に変換されます。

このプロパティは、oracle.hadoop.loader.loaderMap.targetTableを設定しないと無視されます。オプションで、oracle.hadoop.loader.loaderMap.column_name.fieldおよびoracle.hadoop.loader.loaderMap.column_name.formatを設定できます。

oracle.hadoop.loader.loaderMap.column_name.field

型: String

デフォルト値: 正規化された列名

説明: Avroレコードを含むフィールドの名前で、このプロパティ名で識別される列にマップされます。列名は引用符で囲むか囲まないかのいずれかです。引用符で囲む名前には二重引用符(")を最初と最後に付けることで、入力したとおりに使用されます。引用符で囲まれていない名前は大文字に変換されます。オプション。

このプロパティは、oracle.hadoop.loader.loaderMap.columnNamesを設定しないと無視されます。

oracle.hadoop.loader.loaderMap.column_name.format

型: String

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

説明: このプロパティ名で識別される列にロードするデータのデータ形式を指定します。日付形式にはjava.text.SimpleDateformatパターンを、テキストには正規表現パターンを使用します。オプション。

このプロパティは、oracle.hadoop.loader.loaderMap.columnNamesを設定しないと無視されます。

oracle.hadoop.loader.loaderMap.targetTable

型: String

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

説明: ロード先の表のスキーマで修飾された名前。このプロパティは、oracle.hadoop.loader.loaderMapFileよりも優先されます。

列のサブセットをロードするには、oracle.hadoop.loader.loaderMap.columnNamesプロパティを設定します。columnNamesに関しては、オプションで、oracle.hadoop.loader.loaderMap.column_name.fieldを設定して列にマップするフィールドの名前を指定したり、oracle.hadoop.loader.loaderMap.column_name.formatを設定してそれらのフィールドのデータの形式を指定できます。表のすべての列をロードし、入力フィールド名がデータベース列名と一致している場合、columnNamesを設定する必要はありません。

oracle.hadoop.loader.loaderMapFile

ローダー・マップは、リリース2.3以降で非推奨になりました。ローダー・マップ・ファイルは、oracle.hadoop.loader.loaderMap.*構成プロパティに置き換えられています。「手動マッピング」を参照してください。

oracle.hadoop.loader.logBadRecords

型: Boolean

デフォルト値: false

説明: Oracle Loader for Hadoopが不正なレコードをファイルにログ記録するかどうかを制御します。

このプロパティは、入力形式とマッパーで拒否されるレコードのみに適用されます。出力形式またはサンプリング機能で発生したエラーには適用されません。

oracle.hadoop.loader.log4j.propertyPrefix

型: String

デフォルト値: log4j.logger.oracle.hadoop.loader

説明: 構成ファイルからロードされたApache log4jプロパティで使用する接頭辞を識別します。

Oracle Loader for Hadoopでlog4jのプロパティを指定するには、hadoopコマンドに-confオプションおよび-Dオプションを使用します。次に例を示します。

-D log4j.logger.oracle.hadoop.loader.OraLoader=DEBUG
-D log4j.logger.oracle.hadoop.loader.metadata=INFO

この接頭辞で始まるすべての構成プロパティがlog4jにロードされます。これらのプロパティは、log4jに${log4j.configuration}からロードされたものと同じプロパティの設定をオーバーライドします。このオーバーライドは、Oracle Loader for Hadoopのジョブ・ドライバおよびそのマップとリデュースのタスクに適用されます。

構成プロパティはRAW値とともにlog4jにコピーされます。変数の拡張はすべてlog4jに対して実行されます。拡張に使用する構成変数もこの接頭辞で始まる必要があります。

oracle.hadoop.loader.olh_home

型: String

デフォルト値: OLH_HOME環境変数の値

説明: OraLoaderジョブを開始するノード上のOracle Loader for Hadoopのホーム・ディレクトリのパス。このパスは、必要なライブラリの場所を示します。

oracle.hadoop.loader.olhcachePath

型: String

デフォルト値: ${mapreduce.output.fileoutputformat.outputdir}/../olhcache

説明: Oracle Loader for HadoopがMapReduceの分散キャッシュにロードするファイルを作成できるHDFSディレクトリのフル・パスを識別します。

この分散キャッシュは、大規模なアプリケーション固有ファイルをキャッシュし、クラスタ内のノード間に効率的に分散する機能です。

関連項目:

次のサイトにあるJavaドキュメントのorg.apache.hadoop.filecache.DistributedCacheの説明

http://hadoop.apache.org/

oracle.hadoop.loader.output.dirpathBufsize

型: Integer

デフォルト値: 131072 (128KB)

説明: OCIOutputFormatのダイレクト・パス・ストリーム・バッファのサイズをバイト単位で設定します。値は8KBの倍数に切り上げられます。

oracle.hadoop.loader.output.escapeEnclosers

型: Boolean

デフォルト値: false

説明: 埋込みの終了囲み文字をリテラル・テキストとして処理するかどうか(つまり、エスケープするかどうか)を制御します。このプロパティをtrueに設定すると、フィールドにデータ値の一部として終了囲み文字を含めることができます。「oracle.hadoop.loader.output.trailingFieldEncloser」を参照してください。

oracle.hadoop.loader.output.fieldTerminator

型: String

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

説明: DelimitedTextInputFormatの出力フィールドの終了を示す文字。値には、1文字または\uHHHH (HHHHは文字のUTF-16エンコーディング)を指定できます。

oracle.hadoop.loader.output.granuleSize

型: Integer

デフォルト値: 10240000

説明: 生成されたデータ・ポンプ・ファイルのグラニュル・サイズ(バイト)。

グラニュルは、ORACLE_DATAPUMPアクセス・ドライバを使用してファイルをロードする場合の並列処理(PQスレーブ)の作業負荷を決定します。

関連項目:

ORACLE_DATAPUMPアクセス・ドライバの詳細は、『Oracle Databaseユーティリティ』を参照してください。

oracle.hadoop.loader.output.initialFieldEncloser

型: String

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

説明: 出力で生成される、フィールドの開始を示す文字。値には、1文字または\uHHHH (HHHHは文字のUTF-16エンコーディング)を指定する必要があります。長さが0の値は、出力で囲み文字が生成されないことを表します(デフォルト値)。

フィールドにoracle.hadoop.loader.output.fieldTerminatorの値を含める場合は、このプロパティを使用します。フィールドにoracle.hadoop.loader.output.trailingFieldEncloserの値も含めることができるようにするには、oracle.hadoop.loader.output.escapeEnclosersをtrueに設定します。

このプロパティを設定する場合、oracle.hadoop.loader.output.trailingFieldEncloserも設定する必要があります。

oracle.hadoop.loader.output.trailingFieldEncloser

型: String

デフォルト値: oracle.hadoop.loader.output.initialFieldEncloserの値

説明: 出力で生成される、フィールドの終了を示す文字。値には、1文字または\uHHHH (HHHHは文字のUTF-16エンコーディング)を指定する必要があります。ゼロ長値は囲み文字がないことを表します(デフォルト値)。

フィールドにoracle.hadoop.loader.output.fieldTerminatorの値を含める場合は、このプロパティを使用します。フィールドにoracle.hadoop.loader.output.trailingFieldEncloserの値も含めることができるようにするには、oracle.hadoop.loader.output.escapeEnclosersをtrueに設定します。

このプロパティを設定する場合、oracle.hadoop.loader.output.initialFieldEncloserも設定する必要があります。

oracle.hadoop.loader.rejectLimit

型: Integer

デフォルト値: 1000

説明: ジョブの実行が停止するまでに拒否またはスキップできるレコードの最大数。負の値を設定すると、拒否制限が無効になり、ジョブの実行が完了します。

mapreduce.map.speculativeがtrueの場合(デフォルト)、拒否されるレコードの数が一時的に増加して、ジョブが未完了の状態で停止することがあります。

入力形式のエラーは、修復不可能でマップ・タスクが中止になるため、拒否制限に反映されません。サンプリング機能またはオンライン出力形式で発生したエラーも拒否制限に反映されません。

oracle.hadoop.loader.sampler.enableSampling

型: Boolean

デフォルト値: true

説明: サンプリング機能が有効かどうかを制御します。サンプリングを無効にするには、このプロパティをfalseに設定します。

enableSamplingプロパティがtrueに設定されている場合でも、サンプリングが不要な場合、または適切なサンプルを作成できないとローダーが判断した場合、ローダーによってサンプリングが自動的に無効になります。たとえば、表がパーティション化されていない場合、リデューサ・タスクの数が2未満の場合、または入力データが少なすぎて適切なロード・バランシングの計算ができない場合、サンプリングは無効になります。このような場合、ローダーは情報メッセージを返します。

oracle.hadoop.loader.sampler.hintMaxSplitSize

型: Integer

デフォルト値: 1048576 (1MB)

説明: サンプリング・プロセスにHadoopのmapred.max.split.sizeプロパティを設定します。ジョブ構成のmapred.max.split.sizeの値は変わりません。1未満の値は無視されます。

一部の入力形式(FileInputFormatなど)では、getSplitsによって返される分割の数を判断するヒントとしてこのプロパティを使用します。値が小さいほど、ランダムにサンプリングされるデータ・チャンクが多いことを意味し、サンプリング性能が高くなります。

データセットのデータ量が数十TB単位に上る場合や、入力形式のgetSplitsメソッドからメモリー不足エラーが返される場合には、この値を増やします。

分割サイズが大きいほど、I/Oパフォーマンスは高くなりますが、サンプリング性能は必ずしも高くなりません。この値を、適切なサンプリング性能を得られるような小さい値(ただし、小さすぎない値)に設定します。極度に小さい値を設定すると、I/Oパフォーマンスが非効率になり、返される分割数が多すぎてgetSplitsでメモリー不足が発生する可能性があります。

org.apache.hadoop.mapreduce.lib.input.FileInputFormatメソッドでは、このプロパティの値に関係なく、常に最小分割サイズの設定以上の大きさの分割が返されます。

oracle.hadoop.loader.sampler.hintNumMapTasks

型: Integer

デフォルト値: 100

説明: サンプリング・プロセスにHadoopのmapred.map.tasks構成プロパティを設定します。ジョブ構成のmapred.map.tasksの値は変わりません。1未満の値は無視されます。

一部の入力形式(DBInputFormatなど)では、getSplitsメソッドによって返される分割の数を判断するヒントとしてこのプロパティを使用します。値が高いほど、ランダムにサンプリングされるデータ・チャンクが多いことを意味し、サンプリング性能が高くなります。

データセットに対して、この値を100万行より大きい値に増やします。ただし、極度に大きい値を設定すると、返される分割数が多すぎてgetSplitsでメモリー不足が発生する可能性があります。

oracle.hadoop.loader.sampler.loadCI

型: 小数

デフォルト値: 0.95

説明: リデューサの最大負荷係数に対する統計的信頼性インジケータ。

このプロパティは0.5以上1未満の値(0.5 <= 値 < 1)を受け入れます。値が0.5未満の場合、プロパティはデフォルト値にリセットされます。一般的な値は0.90、0.95および0.99です。

「oracle.hadoop.loader.sampler.maxLoadFactor」を参照してください。

oracle.hadoop.loader.sampler.maxHeapBytes

型: Integer

デフォルト値: -1

説明: サンプラが使用可能なメモリーの最大容量をバイト単位で指定します。

次のいずれかの条件が真になった場合、サンプリングは中止されます。

- サンプラがロード・バランシングに必要な最低数のサンプルを収集した。

- サンプリングされたデータの割合(パーセント)がoracle.hadoop.loader.sampler.maxSamplesPctの値を超えている。

- サンプリングされたバイト数がoracle.hadoop.loader.sampler.maxHeapBytesの値を超えている。プロパティに負の値が設定されている場合、この条件は適用されません。

oracle.hadoop.loader.sampler.maxLoadFactor

型: Float

デフォルト値: 0.05 (5%)

説明: リデューサに対する最大許容負荷係数。値が0.05の場合、リデューサは最適な負荷より最大5%多くのデータを割当て可能であることを表します。

このプロパティは0より大きい値を受け入れます。値が0以下の場合、プロパティはデフォルト値にリセットされます。一般的な値は0.05および0.1です。

負荷が完全に分散された状態では、各リデューサに均等な作業量(負荷)が割り当てられています。負荷係数は、(assigned_load - ideal_load)/ideal_loadの計算で求められる各リデューサの相対的な過負荷を表します。ロード・バランシングが成功した場合、ジョブは指定した信頼度の最大負荷係数の範囲内で実行されます。

「oracle.hadoop.loader.sampler.loadCI」を参照してください。

oracle.hadoop.loader.sampler.maxSamplesPct

型: Float

デフォルト値: 0.01 (1%)

説明: 最大サンプル・サイズ(入力データ内のレコード数の割合)を設定します。値0.05は、サンプラがサンプリングするのはレコードの総数の5%以下であることを示します。

このプロパティは0～1の範囲の値(0～100%)を受け入れます。負の値を設定すると、このプロパティは無効になります。

次のいずれかの条件が真になった場合、サンプリングは中止されます。

- サンプラがロード・バランシングに必要な最低数のサンプルを収集した。このサンプル数は、このプロパティで設定した値より小さい場合があります。

- サンプリングされたデータの割合(パーセント)がoracle.hadoop.loader.sampler.maxSamplesPctの値を超えている。

- サンプリングされたバイト数がoracle.hadoop.loader.sampler.maxHeapBytesの値を超えている。プロパティに負の値が設定されている場合、この条件は適用されません。

oracle.hadoop.loader.sampler.minSplits

型: Integer

デフォルト値: 5

説明: サンプラが中止条件を評価するまでに読み取る入力分割の最小数。入力分割の合計数がminSplitsより少ない場合、サンプラはすべての入力分割から読み取ります。

0以下の数値は1として扱われます。

oracle.hadoop.loader.sampler.numThreads

型: Integer

デフォルト値: 5

説明: サンプラのスレッド数。スレッド数が多いほど、サンプリングの同時実行性が高くなります。値が1の場合、サンプラのマルチスレッドが無効になります。

Oracle Loader for Hadoopのジョブを開始するノード上のプロセッサおよびメモリー・リソースに基づいて値を設定します。

oracle.hadoop.loader.sortKey

型: String

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

説明: リデューサ・グループ内の出力レコードのソート・キーを構成する列名のカンマ区切りリスト。

引用符で囲まれている識別子または引用符で囲まれていない識別子を列名にすることができます。

- 引用符で囲まれている識別子の開始と終了には二重引用符(")を使用します。

- 引用符で囲まれていない識別子は、使用する前に大文字に変換されます。

oracle.hadoop.loader.tableMetadataFile

型: String

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

説明: ターゲット表のメタデータ・ファイルへのパス。このプロパティは、オフライン・データベース・モードで実行する場合に設定します。

ローカル・ファイルを指定するには、次の例のようにfile://の構文を使用します。

file:///home/jdoe/metadata.xml

表のメタデータ・ファイルを作成するには、OraLoaderMetadataユーティリティを実行します。「OraLoaderMetadataユーティリティ」を参照してください。

oracle.hadoop.loader.targetTable

非推奨。oracle.hadoop.loader.loaderMap.targetTableを使用します。

Oracle NoSQL Databaseの構成プロパティ

プロパティ

説明

oracle.kv.kvstore

型: String

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

説明: ソース・データがあるKVストアの名前。

oracle.kv.hosts

型: String

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

説明: ソース・データがあるKVストア内のホストを識別する、1つ以上のhostname:portペアの配列。複数のペアはカンマで区切ります。

oracle.kv.batchSize

型: Key

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

説明: 各ネットワーク・ラウンドトリップ中、KVAvroInputFormatがフェッチに必要とするキー数。ゼロ(0)値は、プロパティをデフォルト値に設定します。

oracle.kv.parentKey

型: String

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

説明: 返される値を、指定されたキーの子のキーと値のペアのみに制限します。メジャー・キー・パスを部分パスとし、マイナー・キー・パスを空にする必要があります。null値(デフォルト)は出力を制限しないため、KVAvroInputFormatがストア内のすべてのキーを返します。

oracle.kv.subRange

型: KeyRange

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

説明: 返される値を、oracle.kv.parentKeyにより指定された親キーの下の特定の子へ、さらに制限します。

oracle.kv.depth

型: Depth

デフォルト値: PARENT_AND_DESCENDENTS

説明: 返される値を、oracle.kv.parentKeyの値の下の、特定の階層の深さに制限します。次のキーワードは有効な値です。

- CHILDREN_ONLY: 子を返します。指定された親は返しません。

- DESCENDANTS_ONLY: すべての子孫を返します。指定された親は返しません。

- PARENT_AND_CHILDREN: 子および親を返します。

- PARENT_AND_DESCENDANTS: すべての子孫と親を返します。

oracle.kv.consistency

型: Consistency

デフォルト値: NONE_REQUIRED

説明: 子のキーと値のペアを読み取る際の一貫性保証です。次のキーワードは有効な値です。

- ABSOLUTE: 一貫性が絶対的となるよう、マスターがトランザクションを提供する必要があります。

- NONE_REQUIRED: レプリカが、マスターと比較したレプリカの状態に関係なく、トランザクションを提供することが可能です。

oracle.kv.timeout

型: Long

デフォルト値:

説明: 選択したキーと値のペアを取得する場合の最大時間間隔(ミリ秒)を設定します。ゼロ(0)値は、プロパティをデフォルト値に設定します。

oracle.kv.formatterClass

型: String

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

説明: KeyValueVersionインスタンスをAvro IndexedRecord文字列に書式設定するAvroFormatterインタフェースを実装するクラスの名前を指定します。

Oracle NoSQL DatabaseのAvroレコードは直接Oracle Loader for Hadoopに移るため、NoSQLキーはターゲットのOracle Database表へのマッピングに使用できません。しかし、フォーマッタ・クラスはNoSQLのキーと値の両方を受け取るので、値とキーの両方を含む新しいAvroレコードを作成して返すことができ、これをOracle Loader for Hadoopに渡すことが可能になります。

3.15 同梱されているソフトウェアのサードパーティ・ライセンス

Oracle Loader for Hadoopは、次のサードパーティ製品をインストールします。

- Apache Avro 1.7.3

- Apache Commons Mathematics Library 2.2

- Jackson JSON 1.8.8

Oracle Loader for Hadoopには、Oracle 12cリリース1(12.1)クライアント・ライブラリが含まれます。Oracle Database 12cリリース1 (12.1)に含まれるサードパーティ製品の詳細は、『Oracle Databaseライセンス情報』を参照してください。

Oracle Loader for HadoopはHadoop 0.20.2で構築され、テストされます。

特に断りがないかぎり、あるいは、サードパーティ・ライセンス(LGPLなど)の条項で求められている場合、Apache Licensed Codeに関連するすべてのステートメントを含めた、この項のライセンスとステートメントは、告知のみを目的とするものです。

3.15.1 Apache Licensed Code

The following is included as a notice in compliance with the terms of the Apache 2.0 License, and applies to all programs licensed under the Apache 2.0 license:

You may not use the identified files except in compliance with the Apache License, Version 2.0 (the "License.")

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

A copy of the license is also reproduced below.

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and limitations under the License.

3.15.2 Apache License

- Version 2.0, January 2004

- http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity.For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship.For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner.For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright License.Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License.Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted.If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

4. Redistribution.You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

a. You must give any other recipients of the Work or Derivative Works a copy of this License; and

b. You must cause any modified files to carry prominent notices stating that You changed the files; and

c. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

d. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear.The contents of the NOTICE file are for informational purposes only and do not modify the License.You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

5. Submission of Contributions.Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions.Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. Trademarks.This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty.Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

8. Limitation of Liability.In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

9. Accepting Warranty or Additional Liability.While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License.However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information.(Don't include the brackets!)The text should be enclosed in the appropriate comment syntax for the file format.We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License.

This product includes software developed by The Apache Software Foundation (http://www.apache.org/) (listed below):

3.15.2.1 Apache Avro 1.7.3

Licensed under the Apache License, Version 2.0 (the "License"); you may not use Apache Avro except in compliance with the License.You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License.

3.15.2.2 Apache Commons Mathematics Library 2.2

Copyright 2001-2011 The Apache Software Foundation

Licensed under the Apache License, Version 2.0 (the "License"); you may not use the Apache Commons Mathematics library except in compliance with the License.You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License.

3.15.2.3 Jackson JSON 1.8.8

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this library except in compliance with the License.You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License.

第III部 Oracle XQuery for Hadoop

この部には次の章が含まれます。

- Oracle XQuery for Hadoopの使用

- Oracle XQuery for Hadoopリファレンス

- Oracle XML Extensions for Hive

4 Oracle XQuery for Hadoopの使用

この章では、Oracle XQuery for Hadoopを使用して大量の半構造化データを抽出および変換する方法について説明します。内容は次のとおりです。

- Oracle XQuery for Hadoopとは

- Oracle XQuery for Hadoopを使用する前に

- Oracle XQuery for Hadoopの関数について

- XQuery変換の作成

- 問合せの実行

- Apache Oozieからの問合せの実行

- Oracle XQuery for Hadoopの構成プロパティ

- 同梱されているソフトウェアのサードパーティ・ライセンス

4.1 Oracle XQuery for Hadoopとは

Oracle XQuery for Hadoopは、半構造化されたビッグ・データの変換エンジンです。Oracle XQuery for Hadoopでは、XQuery言語で表された変換を一連のMapReduceジョブに解釈して実行します(これらのジョブはApache Hadoopクラスタ上で並列で実行されます)。ユーザーは、スケーラビリティやパフォーマンスを犠牲にせずに、JavaおよびMapReduceの複雑性に取り組むのではなくデータ移動および変換ロジックに集中できます。

入力データは、Hadoop Distributed File System (HDFS)など、Hadoopのファイル・システムAPIを介してアクセス可能なファイル・システムに配置するか、Oracle NoSQL Databaseに格納できます。Oracle XQuery for Hadoopでは、変換結果をHadoopファイル、Oracle NoSQL DatabaseまたはOracle Databaseに書き込むことができます。

また、Oracle XQuery for Hadoopには、大規模なXMLファイルをサポートするためにApache Hiveに対する拡張が用意されています。

Oracle XQuery for Hadoopは、XPath、XQueryおよびXQuery Update Facilityなどの円熟した業界標準に基づいています。他のOracle製品と完全に統合されているため、Oracle XQuery for Hadoopを使用すると、次のことが可能です。

- Oracle Loader for Hadoopを使用してデータをOracle Databaseに効率的にロードすること。

- Oracle NoSQL Databaseに読取り/書込みサポートを提供すること。

図4-1に、Oracle XQuery for Hadoopを使用したデータ・フローの概要を示します。

図4-1 Oracle XQuery for Hadoopのデータ・フロー

4.2 Oracle XQuery for Hadoopを使用する前に

Oracle XQuery for HadoopはXQuery開発者が使用するように設計されています。XQueryをよく理解している場合はすぐに開始できます。XQuery初心者は、最初に言語の基本を習得する必要があります。この情報については、このガイドには記載されていません。

関連項目:

- 次のサイトにあるW3Schoolsの「XQuery Tutorial」
http://www.w3schools.com/xquery/

- 次のサイトにある『XQuery 3.0: An XML Query Language』
http://www.w3.org/TR/xquery-30

4.2.1 基本的な手順

Oracle XQuery for Hadoopを使用する場合は、次の基本的な手順に従います。

1. 初めてOracle XQuery for Hadoopを使用する場合は、ソフトウェアがインストールおよび構成されていることを確認します。

「Oracle XQuery for Hadoopの設定」を参照してください。

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

3. Oracle XQuery for Hadoop関数を使用するXQuery変換を作成します。入出力には様々なアダプタを使用できます。

「Oracle XQuery for Hadoopの関数について」および「XQuery変換の作成」を参照してください。

4. XQuery変換を実行します。

「問合せの実行」を参照してください。

4.2.2 例: Hello World!

次の手順に従って、Oracle XQuery for Hadoopを使用して単純な問合せを作成し、実行します。

1. Helloの行を含むhello.txtというテキスト・ファイルを現在のディレクトリに作成します。

$ echo "Hello" > hello.txt

2. ファイルをHDFSにコピーします。

$ hdfs dfs -copyFromLocal hello.txt

3. 次の内容でhello.xqという問合せファイルを現在のディレクトリに作成します。

import module "oxh:text";
for $line in text:collection("hello.txt")
return text:put($line || " World!")

4. 問合せを実行します。

$ hadoop jar $OXH_HOME/lib/oxh.jar hello.xq -output ./myout -print
13/11/21 02:41:57 INFO hadoop.xquery: OXH: Oracle XQuery for Hadoop 4.2.0 ((build 4.2.0-cdh5.0.0-mr1 @mr2). Copyright (c) 2014, Oracle.  All rights reserved.
13/11/21 02:42:01 INFO hadoop.xquery: Submitting map-reduce job "oxh:hello.xq#0" id="3593921f-c50c-4bb8-88c0-6b63b439572b.0", inputs=[hdfs://bigdatalite.localdomain:8020/user/oracle/hello.txt], output=myout
.
.
.

5. 出力ファイルを確認します。

$ hdfs dfs -cat ./myout/part-m-00000
Hello World!

4.3 Oracle XQuery for Hadoopの関数について

Oracle XQuery for Hadoopは、ビッグ・データセットに対してcollectionおよびput関数を使用して読取りおよび書込みを実行します。

- collection関数は、HadoopファイルまたはOracle NoSQL Databaseからデータを項目のコレクションとして読み取ります。Hadoopファイルは、Hadoopのファイル・システムAPIを介してアクセスできるファイルです。Oracle Big Data Applianceおよび大半のHadoopクラスタでは、このファイル・システムはHadoop Distributed File System (HDFS)です。

- put関数は、Oracle Database、Oracle NoSQL DatabaseまたはHadoopファイルに格納されたデータセットに対して単一の項目を追加します。

次の例は、項目をソースから読み取って別の場所に書き込むOracle XQuery for Hadoopの単純な問合せです。

for $x in collection(...)
return put($x)

Oracle XQuery for Hadoopには、特定の形式およびソースについてputおよびcollection関数を定義する際に使用できる一連のアダプタが付属しています。各アダプタには2つのコンポーネントがあります。

- 利便性を考慮して事前定義された一連の組込みputおよびcollection関数。

- カスタムputおよびcollection関数の定義に使用できる一連のXQuery関数の注釈。

他の共通して使用する関数もOracle XQuery for Hadoopに含まれています。

4.3.1 アダプタについて

次に、Oracle XQuery for Hadoopアダプタについて簡単に説明します。

Avroファイル・アダプタ

Avroファイル・アダプタは、HDFSに格納されたAvroコンテナ・ファイルへのアクセスを提供します。Avroコンテナ・ファイルに対して読取り/書込みを行うcollectionおよびput関数が含まれています。

「Avroファイル・アダプタ」を参照してください。

JSONファイル・アダプタ

JSONファイル・アダプタは、HDFSに格納されたJSONファイルへのアクセスを提供します。JSONファイルを読み取るためのcollection関数とJSONデータを直接解析するための一連のhelper関数が含まれています。出力を書き込むには、別のアダプタを使用する必要があります。

「JSONファイル・アダプタ」を参照してください。

Oracle Databaseアダプタ

Oracle Databaseアダプタは、データをOracle Databaseにロードします。このアダプタは、JDBCまたはOCIを使用してOracleデータベースの表に出力先を指定するためのカスタムput関数をサポートしています。データベースへのライブ接続が使用可能でない場合、このアダプタはデータ・ポンプまたはHDFSのデリミタ付きテキスト・ファイルへの出力もサポートします。ファイルは、SQL*Loaderなどの異なるユーティリティで、または外部表を使用してOracleデータベースにロードできます。このアダプタはデータをデータベースから移動しないため、collection関数やget関数はありません。

サポートされるOracle Databaseのバージョンについては「ソフトウェア要件」を参照し、その他については「Oracle Databaseアダプタ」を参照してください。

Oracle NoSQL Databaseアダプタ

Oracle NoSQL Databaseアダプタは、Oracle NoSQL Databaseに格納されたデータへのアクセスを提供します。データは表、Avro、XML、バイナリXMLまたはテキストとして読取りまたは書込みできます。このアダプタにはcollection、getおよびput関数が含まれています。

「Oracle NoSQL Databaseアダプタ」を参照してください。

順序ファイル・アダプタ

順序ファイル・アダプタは、Hadoop順序ファイルへのアクセスを提供します。順序ファイルは、キーと値のペアで構成されるHadoop形式です。

このアダプタには、テキスト、XMLまたはバイナリXMLを格納するHDFS順序ファイルに対して読取り/書込みを行うcollectionおよびput関数が含まれています。

「順序ファイル・アダプタ」を参照してください。

Solrアダプタ

Solrアダプタは、フルテキスト索引を作成し、Apache Solrサーバーにロードする機能を提供します。

「Solrアダプタ」を参照してください。

テキスト・ファイル・アダプタ

テキスト・ファイル・アダプタは、CSVファイルなどのテキスト・ファイルへのアクセスを提供します。テキスト・ファイルに対して読取り/書込みを行うcollectionおよびput関数が含まれています。

JSONファイル・アダプタは、テキスト・ファイルに格納されたJSONオブジェクトに対するサポートを拡張します。

「テキスト・ファイル・アダプタ」および「JSONファイル・アダプタ」を参照してください。

XMLファイル・アダプタ

XMLファイル・アダプタは、HDFSに格納されたXMLファイルへのアクセスを提供します。大規模なXMLファイルを読み取るためのcollection関数が含まれています。出力を書き込むには、別のアダプタを使用する必要があります。

「XMLファイル・アダプタ」を参照してください。

4.3.2 Oracle XQuery for Hadoopで使用する他のモジュールについて

問合せでは次の追加モジュールの関数を使用できます。

標準XQuery関数

標準XQuery算術関数を使用できます。

「XQuery言語のサポートについて」を参照してください。

Hadoop関数

Hadoopモジュールは、Hadoopに固有の関数の集合です。

「Hadoopモジュール」を参照してください。

期間、日付および時間の関数

この一連の関数は、期間、日付および時間の値を解析します。

「期間、日付および時刻のOracle XQuery関数」を参照してください。

文字列処理関数

これらの関数は、データ値を囲む空白を追加および削除します。

「文字列のOracle XQuery関数」を参照してください。

4.4 XQuery変換の作成

この章では、Oracle XQuery for Hadoopを使用してXQuery変換を作成する方法について説明します。この項の内容は次のとおりです。

- XQuery変換の要件

- XQuery言語のサポートについて

- Hadoop分散キャッシュのデータへのアクセス

- XQueryからのカスタムJava関数の呼出し

- ユーザー定義のXQueryライブラリ・モジュールおよびXMLスキーマのアクセス

- XQuery変換の例

4.4.1 XQuery変換の要件

Oracle XQuery for Hadoopの変換は、次の追加要件に従う必要があることを除き、他のXQuery変換と同様の方法で作成します。

- 主要なXQuery式(問合せ本文)は、次のいずれかの形式で指定する必要があります。

FLWOR_1

または

(FLWOR_1, FLWOR_2,... , FLWORN)

この構文で、FLWORはXQuery FLWOR式のトップレベルのFLWOR (For、Let、Where、Order by、Returnの頭文字)式です。

関連項目:

次のサイトにある『W3C XQuery 3.0: An XML Query Language』のFLWOR式に関する項

http://www.w3.org/TR/xquery-30/#id-flwor-expressions

- トップレベルの各FLWOR式には、Oracle XQuery for Hadoopのcollection関数全体を反復するfor句が必要です。このfor句には位置指定変数を使用できません。
collection関数については、「Oracle XQuery for Hadoopリファレンス」を参照してください。

- トップレベルの各FLWOR式には、オプションのlet、whereおよびgroup by句を使用できます。order by、count、window句など、その他のタイプの句は無効です。

- トップレベルの各FLWOR式では、Oracle XQuery for Hadoopのput関数の呼出しで1つ以上の結果を返す必要があります。put関数については、「Oracle XQuery for Hadoopリファレンス」を参照してください。

- 問合せ本文は更新式である必要があります。put関数はすべて更新関数として分類されるため、Oracle XQuery for Hadoopのすべての問合せは更新問合せとなります。
Oracle XQuery for Hadoopでは、%*:put注釈は、関数が更新であることを示します。この場合、%updating注釈またはupdatingキーワードは不要です。

関連項目:

更新式については、次のサイトにある『W3C XQuery Update Facility 1.0』のXQuery 1.0に対する拡張に関する項

http://www.w3.org/TR/xquery-update-10/#dt-updating-expression

4.4.2 XQuery言語のサポートについて

Oracle XQuery for HadoopはXQuery 1.0仕様をサポートしています。

- 言語については、次のサイトにあるW3Cの『XQuery 1.0: An XML Query Language』を参照してください。
http://www.w3.org/TR/xquery/

- 関数については、次のサイトにあるW3Cの『XQuery 1.0 and XPath 2.0 Functions and Operators』を参照してください。
http://www.w3.org/TR/xpath-functions/

さらに、Oracle XQuery for Hadoopは、次のXQuery 3.0機能をサポートしています。各リンクによって、W3Cの『XQuery 3.0: An XML Query Language』の関連する項に移動します。

- group by句
http://www.w3.org/TR/xquery-30/#id-group-byを参照してください

- for句とallowing emptyモディファイア
http://www.w3.org/TR/xquery-30/#id-xquery-for-clauseを参照してください

- 注釈
http://www.w3.org/TR/xquery-30/#id-annotationsを参照してください

- 文字列連結式
http://www.w3.org/TR/xquery-30/#id-string-concat-exprを参照してください

- switch式
http://www.w3.org/TR/xquery-30/#id-switchを参照してください。

- 単純map演算子
http://www.w3.org/TR/xquery-30/#id-map-operatorを参照してください。

- プライベート関数および変数
http://www.w3.org/TR/xquery-30/#FunctionDeclnsを参照してください。

http://www.w3.org/TR/xquery-30/#id-variable-declarationsを参照してください。

- unionタイプまたはlistタイプへのキャスト
http://www.w3.org/TR/xquery-30/#casting-to-unionを参照してください。

http://www.w3.org/TR/xquery-30/#casting-to-listを参照してください。

- 純粋なunionタイプのサポート
http://www.w3.org/TR/xquery-30/#dt-pure-union-typeを参照してください。

- validateタイプのサポート
http://www.w3.org/TR/xquery-30/#id-validateを参照してください。

- 標準関数

fn:analyze-string
fn:unparsed-text
fn:unparsed-text-lines
fn:unparsed-text-available
fn:serialize
fn:parse-xml
fn:parse-xml-fragment
fn:generate-id
fn:tail
fn:head
fn:has-children
fn:innermost
fn:outermost

http://www.w3.org/TR/xpath-functions-30/を参照してください

- 三角関数と指数関数
http://www.w3.org/TR/xpath-functions-30/#trigonometryを参照してください

4.4.3 Hadoop分散キャッシュのデータへのアクセス

Hadoop分散キャッシュ機能を使用して補助ジョブ・データにアクセスできます。このメカニズムは、一方が比較的小さいファイルである場合の結合問合せに役立ちます。分散キャッシュからアクセスされるファイルが小さいほど、問合せは高速になります。

ファイルを分散キャッシュに配置するには、Oracle XQuery for Hadoopを呼び出すときに-files Hadoopコマンドライン・オプションを使用します。分散キャッシュからファイルを読み取る問合せで、XMLの場合はfn:doc関数を、テキスト・ファイルの場合はfn:unparsed-textまたはfn:unparsed-text-linesのいずれかを呼び出す必要があります。例4-7を参照してください。

4.4.4 XQueryからのカスタムJava関数の呼出し

Oracle XQuery for Hadoopは、Java言語でカスタム外部関数を実装して拡張できます。Java実装は、パラメータを備えた静的メソッドで、XQuery API for Java (XQJ)仕様に定義されているタイプを返す必要があります。

カスタムJava関数バインディングは、%ora-java:binding注釈を使用して外部関数定義に注釈を指定することで、Oracle XQuery for Hadoopに定義されます。この注釈の構文は、次のとおりです。

%ora-java:binding("java.class.name[#method]")

java.class.name

実装メソッドが格納されているJavaクラスの完全修飾名。

method

Javaメソッド名。XQuery関数名にデフォルト設定されます。オプション。

%ora-java:bindingの例については、例4-8を参照してください。

カスタムJava関数が格納されているJARファイルはすべて-libjarsコマンドライン・オプションに指定する必要があります。次に例を示します。

hadoop jar $OXH_HOME/lib/oxh.jar -libjars myfunctions.jar query.xq

関連項目:

次のサイトにある『XQuery API for Java (XQJ)』

http://www.jcp.org/en/jsr/detail?id=225

4.4.5 ユーザー定義のXQueryライブラリ・モジュールおよびXMLスキーマのアクセス

Oracle XQuery for Hadoopは、次の基準に従う場合、ユーザー定義のXQueryライブラリ・モジュールおよびXMLスキーマをサポートします。

- Oracle XQuery for Hadoopを呼び出すメインの問合せが存在するクライアント上の同じディレクトリに、ライブラリ・モジュールまたはXMLスキーマ・ファイルを配置します。

- import moduleまたはimport schema文のロケーションURIパラメータを使用してメインの問合せからライブラリ・モジュールまたはXMLスキーマをインポートします。

- Oracle XQuery for Hadoopを呼び出す場合は、ライブラリ・モジュールまたはXMLスキーマ・ファイルを-filesコマンドライン・オプションに指定します。

ユーザー定義のXQueryライブラリ・モジュールおよびXMLスキーマの使用例は、例4-9を参照してください。

関連項目:

次のサイトにある『XQuery 3.0: An XML Query Language』のロケーションURIに関する項

http://www.w3.org/TR/xquery-30/#id-module-handling-location-uris

4.4.6 XQuery変換の例

これらの例では、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

例4-1 基本的なフィルタ

この問合せは、ユーザーkellyがアクセスしたページをフィルタ処理し、そのファイルをテキスト・ファイルに書き込みます。

import module "oxh:text";

for $line in text:collection("mydata/visits*.log")
let $split := fn:tokenize($line, "\s*,\s*")
where $split[2] eq "kelly"
return text:put($line)

この問合せは、次の行を含むテキスト・ファイルを出力ディレクトリに作成します。

2013-11-04T06:12:51, kelly, index.html, 200
2013-11-04T06:12:40, kelly, contact.html, 200
2013-10-28T08:30:02, kelly, index.html, 200
2013-10-28T08:32:50, kelly, about.html, 200

例4-2 分類と集計

次の問合せは、ページに対する1日当たりのアクセス数を計算します。

import module "oxh:text";

for $line in text:collection("mydata/visits*.log")
let $split := fn:tokenize($line, "\s*,\s*")
let $time := xs:dateTime($split[1])
let $day := xs:date($time)
group by $day
return text:put($day || " => " || fn:count($line))

この問合せは、次の行を含むテキスト・ファイルを作成します。

2013-10-28 => 3
2013-10-30 => 3
2013-11-01 => 1
2013-11-04 => 2

例4-3 内部結合

この例は、他のファイルに加え、HDFSの次のテキスト・ファイルを問い合せます。このファイルには、ユーザーID、姓名、年齢などのユーザー・プロファイル情報がコロン(:)区切りで格納されています。

mydata/users.txt

john:John Doe:45
kelly:Kelly Johnson:32
laura:Laura Smith:
phil:Phil Johnson:27

次の問合せは、users.txtとログ・ファイルの結合を実行します。30歳を超えるユーザーが各ページにアクセスした回数を計算します。

import module "oxh:text";

for $userLine in text:collection("mydata/users.txt")
let $userSplit := fn:tokenize($userLine, "\s*:\s*")
let $userId := $userSplit[1]
let $userAge := xs:integer($userSplit[3][. castable as xs:integer])

for $visitLine in text:collection("mydata/visits*.log")
let $visitSplit := fn:tokenize($visitLine, "\s*,\s*")
let $visitUserId := $visitSplit[2]
where $userId eq $visitUserId and $userAge gt 30
group by $page := $visitSplit[3]
return text:put($page || " " || fn:count($userLine))

この問合せは、次の行を含むテキスト・ファイルを作成します。

about.html 2
contact.html 1
index.html 4

次の問合せは、任意のページにアクセスした各ユーザーのアクセス数を計算します。ページにアクセスしたことがないユーザーは除外されます。

import module "oxh:text";

for $userLine in text:collection("mydata/users.txt")
let $userSplit := fn:tokenize($userLine, "\s*:\s*")
let $userId := $userSplit[1]

for $visitLine in text:collection("mydata/visits*.log")
[$userId eq fn:tokenize(., "\s*,\s*")[2]]

group by $userId
return text:put($userId || " " || fn:count($visitLine))

この問合せは、次の行を含むテキスト・ファイルを作成します。

john 3
kelly 4
laura 1

注意:

2つのcollection関数の結果を結合する場合は、等価結合のみがサポートされます。ソースの一方または両方がcollection関数からのソースでない場合は、任意の結合条件が許可されます。

例4-4 左外部結合

この例は例4-3の2番目の問合せと類似していますが、ページにアクセスしなかったユーザーもカウントします。

import module "oxh:text";

for $userLine in text:collection("mydata/users.txt")
let $userSplit := fn:tokenize($userLine, "\s*:\s*")
let $userId := $userSplit[1]

for $visitLine allowing empty in text:collection("mydata/visits*.log")
[$userId eq fn:tokenize(., "\s*,\s*")[2]]

group by $userId
return text:put($userId || " " || fn:count($visitLine))

この問合せは、次の行を含むテキスト・ファイルを作成します。

john 3
kelly 4
laura 1
phil 0

例4-5 セミ結合

次の問合せは、ページにアクセスしたユーザーを検出します。

import module "oxh:text";

for $userLine in text:collection("mydata/users.txt")
let $userId := fn:tokenize($userLine, "\s*:\s*")[1]

where some $visitLine in text:collection("mydata/visits*.log")
satisfies $userId eq fn:tokenize($visitLine, "\s*,\s*")[2]

return text:put($userId)

この問合せは、次の行を含むテキスト・ファイルを作成します。

john
kelly
laura

例4-6 複数の出力

次の問合せは、コードが401のWebページ・アクセスを検索し、XQueryのtext:trace()関数を使用してtrace*ファイルに書き込みます。残りのアクセス・レコードはデフォルトの出力ファイルに書き込みます。

import module "oxh:text";

for $visitLine in text:collection("mydata/visits*.log")
let $visitCode := xs:integer(fn:tokenize($visitLine, "\s*,\s*")[4])
return if ($visitCode eq 401) then text:trace($visitLine) else text:put($visitLine)

この問合せは、次の行を含むtrace*テキスト・ファイルを生成します。

2013-10-30T10:00:10, mike, index.html, 401

この問合せは、次の行を含むデフォルトの出力ファイルも生成します。

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
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

例4-7 補助入力データのアクセス

次の問合せは例4-3の2番目の問合せの代替バージョンですが、fn:unparsed-text-lines関数を使用してHadoop分散キャッシュのファイルにアクセスします。

import module "oxh:text";

for $visitLine in text:collection("mydata/visits*.log")
let $visitUserId := fn:tokenize($visitLine, "\s*,\s*")[2]

for $userLine in fn:unparsed-text-lines("users.txt")
let $userSplit := fn:tokenize($userLine, "\s*:\s*")
let $userId := $userSplit[1]

where $userId eq $visitUserId

group by $userId
return text:put($userId || " " || fn:count($visitLine))

問合せを実行するhadoopコマンドには、Hadoopの-filesオプションを使用する必要があります。「Hadoop分散キャッシュのデータへのアクセス」を参照してください。

hadoop jar $OXH_HOME/lib/oxh.jar -files users.txt query.xq

この問合せは、次の行を含むテキスト・ファイルを作成します。

john 3
kelly 4
laura 1

例4-8 XQueryからのカスタムJava関数の呼出し

次の問合せは、java.lang.String#formatメソッドを使用して入力データを書式設定します。

import module "oxh:text";

declare %ora-java:binding("java.lang.String#format")
function local:string-format($pattern as xs:string, $data as xs:anyAtomicType*) as xs:string external;

for $line in text:collection("mydata/users*.txt")
let $split := fn:tokenize($line, "\s*:\s*")
return text:put(local:string-format("%s,%s,%s", $split))

この問合せは、次の行を含むテキスト・ファイルを作成します。

john,John Doe,45
kelly,Kelly Johnson,32
laura,Laura Smith,
phil,Phil Johnson,27

関連項目:

次のサイトにある『Java Platform Standard Edition 7 API Specification』のStringクラスに関する項

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#format(java.lang.String, java.lang.Object)

例4-9 ユーザー定義のXQueryライブラリ・モジュールおよびXMLスキーマの使用

この例では、mytools.xqというライブラリ・モジュールを使用します。

module namespace mytools = "urn:mytools";

declare %ora-java:binding("java.lang.String#format")
function mytools:string-format($pattern as xs:string, $data as xs:anyAtomicType*) as xs:string external;

次の問合せは前の例と同等ですが、string-format関数をmytools.xqライブラリ・モジュールから呼び出します。

import module namespace mytools = "urn:mytools" at "mytools.xq";
import module "oxh:text";

for $line in text:collection("mydata/users*.txt")
let $split := fn:tokenize($line, "\s*:\s*")
return text:put(mytools:string-format("%s,%s,%s", $split))

この問合せは、次の行を含むテキスト・ファイルを作成します。

john,John Doe,45
kelly,Kelly Johnson,32
laura,Laura Smith,
phil,Phil Johnson,27

4.5 問合せの実行

問合せを実行するには、hadoop jarコマンドを使用してoxhユーティリティを呼び出します。基本的な構文は次のとおりです。

hadoop jar $OXH_HOME/lib/oxh.jar [generic options] query.xq -output directory [-clean] [-ls] [-print] [-sharelib hdfs_dir][-skiperrors] [-version]

4.5.1 Oracle XQuery for Hadoopのオプション

query.xq

XQueryファイルを識別します。「XQuery変換の作成」を参照してください。

-clean

問合せの実行前に、出力ディレクトリからすべてのファイルを削除します。デフォルト・ディレクトリを使用する場合、Oracle XQuery for Hadoopはこのオプションが省略されている場合でも常にディレクトリを空にします。

-exportliboozie directory

Oracle XQuery for Hadoopの依存関係を指定されたディレクトリにコピーします。このオプションは、Oracle XQuery for HadoopをHadoop分散キャッシュおよびOozie共有ライブラリに追加する場合に使用します。外部依存関係もコピーされるため、KVHOME、OLH_HOMEおよびOXH_SOLR_MR_HOMEなどの環境変数が関連アダプタ(Oracle NoSQL Database、Oracle DatabaseおよびSolr)で使用するように設定されていることを確認します。

-ls

問合せ実行後に、出力ディレクトリの内容をリスト表示します。

-output directory

問合せの出力ディレクトリを指定します。ファイル・アダプタのput関数によって、このディレクトリにファイルが作成されます。書き込まれた値は、1つ以上のファイルに展開されます。作成されるファイル数は、問合せがどのように複数のタスクに分散されているかによって異なります。デフォルトの出力ディレクトリは/tmp/oxh-user_name/outputです。

put関数の説明は、「Oracle XQuery for Hadoopの関数について」を参照してください。

-print

出力ディレクトリ内の全ファイルの内容を標準出力(画面)に印刷します。Avroファイルの印刷時は、各レコードがJSONテキストとして印刷されます。

-sharelib hdfs_dir

Oracle XQuery for Hadoopおよびサードパーティ・ライブラリが含まれているHDFSフォルダの場所を指定します。

-skiperrors

エラーで処理が停止しないように、エラー・リカバリをオンに切り替えます。

問合せ処理中に発生したすべてのエラーがカウントされ、問合せ終了時に合計がログに記録されます。また、タスクごとに最初の20件のエラーのエラー・メッセージがログに記録されます。次の構成プロパティを参照してください。

- oracle.hadoop.xquery.skiperrors.counters

- oracle.hadoop.xquery.skiperrors.max

- oracle.hadoop.xquery.skiperrors.log.max

-version

Oracle XQuery for Hadoopのバージョンを表示し、問合せを実行せずに終了します。

4.5.2 汎用オプション

任意の汎用的なhadoopコマンドライン・オプションを指定できます。Oracle XQuery for Hadoopは、org.apache.hadoop.util.Toolインタフェースを実装し、MapReduceアプリケーションを構築する標準的なHadoopの方法に従います。

Oracle XQuery for Hadoopでは、次の汎用オプションが一般的に使用されます。

-conf job_config.xml

ジョブ構成ファイルを識別します。「Oracle XQuery for Hadoopの構成プロパティ」を参照してください。

Oracle DatabaseまたはOracle NoSQL Databaseのアダプタを使用している場合は、このファイルに様々なジョブ・プロパティを設定できます。「Oracle Loader for Hadoop構成プロパティおよび対応する%oracle-property注釈」および「Oracle NoSQL Databaseアダプタの構成プロパティ」を参照してください。

-D property=value

構成プロパティを識別します。「Oracle XQuery for Hadoopの構成プロパティ」を参照してください。

-files

分散キャッシュに追加するファイルのカンマ区切りリストを指定します。「Hadoop分散キャッシュのデータへのアクセス」を参照してください。

関連項目:

汎用オプションの詳細は、次のサイトを参照してください。

http://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/CommandsManual.html#Generic_Options

4.5.3 ローカルでの問合せの実行について

問合せの開発では、問合せをクラスタに送信する前に、ローカルで実行できます。ローカル実行を使用することで、小さいデータセットで問合せが動作する様子を確認し、潜在的な問題を迅速に診断できます。

ローカル・モードでは、HDFSではなくローカル・ファイル・システムに対して相対的なURIで解決し、問合せをシングル・プロセスで実行します。

問合せをローカル・モードで実行するには、次の手順を実行します。

1. Hadoopの-jtおよび-fs汎用引数をlocalに設定します。この例では、「例: Hello World!」に記載されている問合せをローカル・モードで実行します。

$ hadoop jar $OXH_HOME/lib/oxh.jar -jt local -fs local ./hello.xq -output ./myoutput -print

2. 問合せのローカル出力ディレクトリ内の結果ファイルを、この例のようにして確認します。

$ cat ./myoutput/part-m-00000
Hello World!

4.6 Apache Oozieからの問合せの実行

Apache Oozieは、複数のMapReduceジョブを指定した順番に(およびオプションで予定された時間に)実行するワークフロー・ツールです。Oracle XQuery for Hadoopは、OozieワークフローからのOracle XQuery for Hadoopの問合せの実行に使用できるOozieアクション・ノードを提供します。

4.6.1 Oracle XQuery for HadoopのOozieアクションの使用に関する概要

次の手順に従って、Oozieワークフローで問合せを実行します。

1. Oracle XQuery for Hadoopで初めてOozieを使用する場合は、Oozieが正しく構成されているか確認します。「Oracle XQuery for HadoopアクションのOozieの構成」を参照してください。

2. いつもと同じようにOracle XQuery for Hadoopで問合せを開発します。

3. 例4-10で示す例のように、ワークフローXMLファイルを作成します。「サポートされているXML要素」にリストされているXML要素を使用できます。

4. Oozieジョブ・パラメータを設定します。次のパラメータが必要です。

oozie.use.system.libpath=true

詳細は、例4-12を参照してください。

5. 次のような構文を使用してジョブを実行します。

oozie job -name http://example.com:11000/oozie -config filename -run

関連項目:

次のサイトにあるApache Oozieコマンド・ライン・インタフェース・ユーティリティのOozieコマンドライン使用方法に関する項

https://oozie.apache.org/docs/4.0.0/DG_CommandLineTool.html#Oozie_Command_Line_Usage

4.6.2 サポートされているXML要素

Oracle XQuery for Hadoopアクションにより、OozieのJavaアクションが拡張されます。このアクションでは、Javaアクションと同じ構文およびセマンティクスを持つ次のオプションの子XML要素がサポートされます。

- archive

- configuration

- file

- job-tracker

- job-xml

- name-node

- prepare

関連項目:

Javaアクションは、次のサイトのOozie仕様で説明されています。

https://oozie.apache.org/docs/4.0.0/WorkflowFunctionalSpec.html#a3.2.7_Java_Action

さらに、Oracle XQuery for Hadoopアクションでは、次の要素がサポートされています。

- script: Oracle XQuery for Hadoop問合せファイルの場所。必須。
問合せファイルはワークフロー・アプリケーション・ディレクトリに置く必要があります。相対パスはアプリケーション・ディレクトリに対して解決されます。

例: <script>myquery.xq</script>

- output: 問合せの出力ディレクトリ。必須。
output要素にはオプションのclean属性があります。この属性をtrueに設定し、出力ディレクトリを削除してから問合せを実行します。出力ディレクトリがすでに存在し、clean属性が設定されていないかfalseに設定されている場合、エラーが発生します。ジョブを実行しているときは出力ディレクトリは存在できません。

例: <output clean="true">/user/jdoe/myoutput</output>

問合せ句の実行時に発生したあらゆるエラーによって、Oozieではそのアクションに対するエラー遷移が実行されます。

4.6.3 例: Hello World

この例では、次のファイルを使用します。

- workflow.xml: hello.xqにある問合せの2つの構成値(HDFSファイルおよび文字列World!)を設定するOozieアクションの情報を表示します。
HDFS入力ファイルは/user/jdoe/data/hello.txtで、次の文字列が含まれています。

Hello

詳細は、例4-10を参照してください。

- hello.xq: Oracle XQuery for Hadoopを使用して問合せを実行します。
詳細は、例4-11を参照してください。

- job.properties: Oozieのジョブ・プロパティをリストします。詳細は、例4-12を参照してください。

例を実行するには、このコマンドを使用します。

oozie job -oozie http://example.com:11000/oozie -config job.properties -run

ジョブを実行した後、/user/jdoe/myoutput出力ディレクトリには、テキスト"Hello World!"を含むファイルが置かれます。

例4-10 Hello Worldのworkflow.xmlファイル

このファイルは/user/jdoe/hello-oozie-oxh/workflow.xmlという名前です。job.propertiesファイルに定義された変数を使用します。

<workflow-app xmlns="uri:oozie:workflow:0.4" name="oxh-helloworld-wf">
<start to="hello-node"/>
<action name="hello-node">
<oxh xmlns="oxh:oozie-action:v1">
<job-tracker>${jobTracker}</job-tracker>
<name-node>${nameNode}</name-node>

<!--
The configuration can be used to parameterize the query.
-->
<configuration>
<property>
<name>myinput</name>
<value>${nameNode}/user/jdoe/data/src.txt</value>
</property>
<property>
<name>mysuffix</name>
<value> World!</value>
</property>
</configuration>

<script>hello.xq</script>

<output clean="true">${nameNode}/user/jdoe/myoutput</output>

</oxh>
<ok to="end"/>
<error to="fail"/>
</action>
<kill name="fail">
<message>OXH failed: [${wf:errorMessage(wf:lastErrorNode())}]</message>
</kill>
<end name="end"/>
</workflow-app>

例4-11 Hello Worldのhello.xq ファイル

このファイルは/user/jdoe/hello-oozie-oxh/hello.xqという名前です。

import module "oxh:text";

declare variable $input := oxh:property("myinput");
declare variable $suffix := oxh:property("mysuffix");

for $line in text:collection($input)
return
text:put($line || $suffix)

例4-12 Hello Worldのjob.propertiesファイル

oozie.wf.application.path=hdfs://example.com:8020/user/jdoe/hello-oozie-oxh
nameNode=hdfs://example.com:8020
jobTracker=hdfs://example.com:8032
oozie.use.system.libpath=true

4.7 Oracle XQuery for Hadoopの構成プロパティ

Oracle XQuery for Hadoopでは、構成プロパティを指定する汎用メソッドをhadoopコマンドで使用します。構成ファイルを指定する場合は-confオプションを使用し、個別のプロパティを指定する場合は-Dオプションを使用します。「問合せの実行」を参照してください。

関連項目:

ジョブ構成ファイルに関するHadoopのドキュメント

http://wiki.apache.org/hadoop/JobConfFile

プロパティ

説明

oracle.hadoop.xquery.lib.share

型: String

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

説明: Oracle XQuery for Hadoopのライブラリおよびサードパーティ・ソフトウェアを含むHDFSディレクトリを特定します。次に例を示します。

http://path/to/shared/folder

すべてのHDFSファイルは同じディレクトリに置く必要があります。

または、コマンドラインで-sharelibオプションを使用します。

パターン一致: ディレクトリ名にパターン一致文字を使用できます。複数のディレクトリのパターンが一致した場合、変更のタイムスタンプが最新のディレクトリが使用されます。

ディレクトリ名を指定するには、英数字を使用し、オプションで次のパターン一致の特殊文字を使用します。

パターン

説明

?

任意の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}内の文字列に一致します。

Oozieライブラリ: 値oxh:oozieは/user/{oozie、user}/share/lib/{oxh,*/oxh*}に自動的に展開されます。これらのディレクトリはサポートされているOozieバージョンの共通検索パスです。userは現在のユーザー名です。ただし、すべてのライブラリはHDFSに事前インストールされているため、Oracle XQuery for Hadoop Oozieアクションは問合せ実行時にこの設定を無視します。

oracle.hadoop.xquery.output

型: String

デフォルト値: /tmp/oxh-user_name/output。user_nameは、Oracle XQuery for Hadoopを実行しているユーザーの名前です。

説明: 問合せの出力ディレクトリを設定します。このプロパティは、-outputコマンドライン・オプションと同等です。「Oracle XQuery for Hadoopのオプション」を参照してください。

oracle.hadoop.xquery.scratch

型: String

デフォルト値: /tmp/oxh-user_name/scratch。user_nameは、Oracle XQuery for Hadoopを実行しているユーザーの名前です。

説明: 一時ファイルを格納するために、Oracle XQuery for HadoopのHDFS一時ディレクトリを設定します。

oracle.hadoop.xquery.timezone

型: String

デフォルト値: クライアント・システムのタイムゾーン

説明: XQueryの暗黙的なタイムゾーンで、date、timeまたはdatetime値にタイムゾーンがない場合に、比較または算術の操作に使用されます。値はJava TimeZoneクラスによって記述された形式である必要があります。次のサイトにある『Java 7 API Specification』のTimeZoneクラスの説明を参照してください。

http://docs.oracle.com/javase/7/docs/api/java/util/TimeZone.html

oracle.hadoop.xquery.skiperrors

型: Boolean

デフォルト値: false

説明: エラー・リカバリをオンにする場合はtrueに設定し、エラー発生時に処理を停止する場合はfalseに設定します。このプロパティは、-skiperrorsコマンドライン・オプションと同等です。

oracle.hadoop.xquery.skiperrors.counters

型: Boolean

デフォルト値: true

説明: エラー・コード別にエラーを分類する場合はtrueに設定し、すべてのエラーを単一のカウンタでレポートする場合はfalseに設定します。

oracle.hadoop.xquery.skiperrors.max

型: Integer

デフォルト値: Unlimited

説明: 単一のMapReduceタスクがリカバリできるエラーの最大数を設定します。

oracle.hadoop.xquery.skiperrors.log.max

型: Integer

デフォルト値: 20

説明: 単一のMapReduceタスクでログに記録するエラーの最大数を設定します。

log4j.logger.oracle.hadoop.xquery

型: String

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

説明: 指定のしきい値レベルでタスクごとにlog4jロガーを構成します。プロパティを値OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALLのいずれかに設定します。このプロパティが設定されていない場合、Oracle XQuery for Hadoopはlog4jを構成しません。

4.8 同梱されているソフトウェアのサードパーティ・ライセンス

Oracle XQuery for Hadoopでは、次のサードパーティ製品がインストールされます。

- ANTLR 3.2

- Apache Ant 1.7.1

- Apache Xerces 2.9.1

- Apache XMLBeans 2.3, 2.5

- Jackson 1.8.8

- Woodstox XML Parser 4.2.0

特に断りがないかぎり、あるいは、サードパーティ・ライセンス(LGPLなど)の条項で求められている場合、Apache Licensed Codeに関連するすべてのステートメントを含めた、この項のライセンスとステートメントは、告知のみを目的とするものです。

4.8.1 Apache Licensed Code

The following is included as a notice in compliance with the terms of the Apache 2.0 License, and applies to all programs licensed under the Apache 2.0 license:

You may not use the identified files except in compliance with the Apache License, Version 2.0 (the "License.")

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

ライセンスのコピーは次の条件で複製することができます。

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and limitations under the License.

4.8.2 Apache License

- Version 2.0, January 2004

- http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

1. Definitions
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity.For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship.For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner.For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

2. Grant of Copyright LicenseSubject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent LicenseSubject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted.If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.

4. Redistribution.You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:

a. You must give any other recipients of the Work or Derivative Works a copy of this License; and

b. You must cause any modified files to carry prominent notices stating that You changed the files; and

c. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and

d. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear.The contents of the NOTICE file are for informational purposes only and do not modify the License.You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

5. Submission of Contributions.Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions.Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.

6. Trademarks.This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.

7. Disclaimer of Warranty.Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.

8. Limitation of Liability.In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.

9. Accepting Warranty or Additional LiabilityWhile redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License.However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information.(Don't include the brackets!)The text should be enclosed in the appropriate comment syntax for the file format.We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License.

This product includes software developed by The Apache Software Foundation (http://www.apache.org/) (listed below):

4.8.3 ANTLR 3.2

[The BSD License]

Copyright © 2010 Terence Parr

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

- Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

4.8.4 Apache Ant 1.7.1

Copyright 1999-2008 The Apache Software Foundation

This product includes software developed by The Apache Software Foundation (http://www.apache.org)

This product includes also software developed by:

- the W3C consortium (http://www.w3c.org)

- the SAX project (http://www.saxproject.org)

The <sync> task is based on code Copyright (c) 2002, Landmark Graphics Corp that has been kindly donated to the Apache Software Foundation.

Portions of this software were originally based on the following:

- software copyright (c) 1999, IBM Corporation, http://www.ibm.com.

- software copyright (c) 1999, Sun Microsystems, http://www.sun.com.

- voluntary contributions made by Paul Eng on behalf of the Apache Software Foundation that were originally developed at iClick, Inc., software copyright (c) 1999

W3C® SOFTWARE NOTICE AND LICENSE

http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231

This work (and included software, documentation such as READMEs, or other related items) is being provided by the copyright holders under the following license.By obtaining, using and/or copying this work, you (the licensee) agree that you have read, understood, and will comply with the following terms and conditions.

Permission to copy, modify, and distribute this software and its documentation, with or without modification, for any purpose and without fee or royalty is hereby granted, provided that you include the following on ALL copies of the software and documentation or portions thereof, including modifications:

1. The full text of this NOTICE in a location viewable to users of the redistributed or derivative work.

2. Any pre-existing intellectual property disclaimers, notices, or terms and conditions.If none exist, the W3C Software Short Notice should be included (hypertext is preferred, text is permitted) within the body of any redistributed or derivative code.

3. Notice of any changes or modifications to the files, including the date changes were made.(We recommend you provide URIs to the location from which the code is derived.)

THIS SOFTWARE AND DOCUMENTATION IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE OR DOCUMENTATION WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS.

COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF ANY USE OF THE SOFTWARE OR DOCUMENTATION.

The name and trademarks of copyright holders may NOT be used in advertising or publicity pertaining to the software without specific, written prior permission.Title to copyright in this software and any associated documentation will at all times remain with copyright holders.

This formulation of W3C's notice and license became active on December 31 2002.This version removes the copyright ownership notice such that this license can be used with materials other than those owned by the W3C, reflects that ERCIM is now a host of the W3C, includes references to this specific dated version of the license, and removes the ambiguous grant of "use".Otherwise, this version is the same as the previous version and is written so as to preserve the Free Software Foundation's assessment of GPL compatibility and OSI's certification under the Open Source Definition.Please see our Copyright FAQ for common questions about using materials from our site, including specific terms and conditions for packages like libwww, Amaya, and Jigsaw.Other questions about this notice can be directed to site-policy@w3.org.

Joseph Reagle <site-policy@w3.org>

This license came from: http://www.megginson.com/SAX/copying.html

However please note future versions of SAX may be covered under http://saxproject.org/?selected=pd

SAX2 is Free!

I hereby abandon any property rights to SAX 2.0 (the Simple API for XML), and release all of the SAX 2.0 source code, compiled code, and documentation contained in this distribution into the Public Domain.SAX comes with NO WARRANTY or guarantee of fitness for any purpose.

David Megginson, david@megginson.com

2000-05-05

4.8.5 Apache Xerces 2.9.1

Xerces Copyright © 1999-2002 The Apache Software Foundation.All rights reserved. Licensed under the Apache 1.1 License Agreement.

The names "Xerces" and "Apache Software Foundation must not be used to endorse or promote products derived from this software or be used in a product name without prior written permission.For written permission, please contact apache@apache.org email address.

This software consists of voluntary contributions made by many individuals on behalf of the Apache Software Foundation.For more information on the Apache Software Foundation, please see http://www.apache.org website

The Apache Software License, Version 1.1

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

3. The end-user documentation included with the redistribution, if any, must include the acknowledgements set forth above in connection with the software (“This product includes software developed by the ….)Alternately, this acknowledgement may appear in the software itself, if and wherever such third-party acknowledgements normally appear.

4. The names identified above with the specific software must not be used to endorse or promote products derived from this software without prior written permission.For written permission, please contact apache@apache.org email address.

5. Products derived from this software may not be called "Apache" nor may "Apache" appear in their names without prior written permission of the Apache Group.

THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

4.8.6 Apache XMLBeans 2.3, 2.5

This product includes software developed by The Apache Software Foundation (http://www.apache.org/).

Portions of this software were originally based on the following:

- software copyright (c) 2000-2003, BEA Systems, <http://www.bea.com/>.

Aside from contributions to the Apache XMLBeans project, this software also includes:

- one or more source files from the Apache Xerces-J and Apache Axis products, Copyright (c) 1999-2003 Apache Software Foundation

- W3C XML Schema documents Copyright 2001-2003 (c) World Wide Web Consortium (Massachusetts Institute of Technology, European Research Consortium for Informatics and Mathematics, Keio University)

- resolver.jar from Apache Xml Commons project, Copyright (c) 2001-2003 Apache Software Foundation

- Piccolo XML Parser for Java from http://piccolo.sourceforge.net/, Copyright 2002 Yuval Oren under the terms of the Apache Software License 2.0

- JSR-173 Streaming API for XML from http://sourceforge.net/projects/xmlpullparser/, Copyright 2005 BEA under the terms of the Apache Software License 2.0

4.8.7 Jackson 1.8.8

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions and limitations under the License.

4.8.8 Woodstox XML Parser 4.2.0

This copy of Woodstox XML processor is licensed under the Apache (Software) License, version 2.0 ("the License").See the License for details about distribution rights, and the specific rights regarding derivate works.

You may obtain a copy of the License at:

http://www.apache.org/licenses/

A copy is also included with both the downloadable source code package and jar that contains class bytecodes, as file "ASL 2.0".In both cases, that file should be located next to this file: in source distribution the location should be "release-notes/asl"; and in jar "META-INF/"

This product currently only contains code developed by authors of specific components, as identified by the source code files.

Since product implements StAX API, it has dependencies to StAX API classes.

For additional credits (generally to people who reported problems) see CREDITS file.

5 Oracle XQuery for Hadoopリファレンス

この章では、Oracle XQuery for Hadoopで使用できるアダプタについて説明します。

- Avroファイル・アダプタ

- JSONファイル・アダプタ

- Oracle Databaseアダプタ

- Oracle NoSQL Databaseアダプタ

- 順序ファイル・アダプタ

- Solrアダプタ

- テキスト・ファイル・アダプタ

- Tikaファイル・アダプタ

- XMLファイル・アダプタ

- シリアライズ注釈

この章では、その他のライブラリ・モジュールについても説明します。

- Hadoopモジュール

- ユーティリティ・モジュール

5.1 Avroファイル・アダプタ

Avroファイル・アダプタは、HDFS内のAvroコンテナ・ファイルの読取りおよび書込みを実行する関数を提供します。この項の内容は次のとおりです。

- Avroファイルを読み取る組込み関数

- Avroコンテナ・ファイルを読み取るカスタム関数

- Avroファイルを書き込むカスタム関数

- Avroファイル・アダプタの関数の例

- AvroとXML間の値の変換について

5.1.1 Avroファイルを読み取る組込み関数

問合せで組込み関数を使用するには、次のようにAvroファイル・モジュールをインポートする必要があります。

import module "oxh:avro";

Avroファイル・モジュールには、次の関数が含まれています。

- avro:collection-avroxml

- avro:get

Avroコンテナ・ファイルを書き込む組込み関数はありません。Avroファイルを書き込むには、Avroライター・スキーマを指定するカスタム関数を使用する必要があります。

5.1.1.1 avro:collection-avroxml

HDFS内のAvroファイルのコレクションにアクセスします。ファイルを分割して、複数のタスクで並列で処理できます。関数は、各オブジェクトのXML要素を返します。「AvroとXML間の値の変換について」を参照してください。

シグネチャ

declare %avro:collection("avroxml") function
avro:collection-avroxml($uris as xs:string*) as element()* external;

パラメータ

$uris: AvroファイルのURI

戻り値

各Avroオブジェクトに対して1つのXML要素。

5.1.1.2 avro:get

XMLとしてモデル化されたAvroマップからエントリを取得します。

$mapパラメータを省略すると、動作は、2つの引数の関数を呼び出して$mapのコンテキスト項目を使用するのと同じです。

シグネチャ

avro:get($key as xs:string?, $map as node()?) as element(oxh:entry)?

avro:get($key as xs:string?) as element(oxh:entry)?

戻り値

このXPath式の値は次のとおりです。

$map/oxh:entry[@key eq $key]

例

次の関数呼出しは同等です。

$var/avro:get("key")

avro:get("key", $var)

$var/oxh:entry[@key eq "key"]

この例では、$varはXMLとしてモデル化されたAvroマップです。「マップの読取り」を参照してください。

5.1.2 Avroコンテナ・ファイルを読み取るカスタム関数

次の注釈を使用して、HDFS内のAvroコンテナ・ファイルのコレクションを読み取る関数を定義できます。これらの注釈によって、組込み関数では使用できない追加機能を使用できます。

シグネチャ

Avroファイルを読み取るカスタム関数には、次のシグネチャが必要です。

declare %avro:collection("avroxml") [additional annotations]
function local:myFunctionName($uris as xs:string*) as element()* external;

注釈

%avro:collection("avroxml")

avroxml collection関数を宣言します。必須。

collection関数によって、HDFS内のAvroファイルにアクセスします。ファイルを分割して、複数のタスクで並列で処理できます。関数は、各オブジェクトのXML要素を返します。「AvroとXML間の値の変換について」を参照してください。

%avro:schema("avro-schema")

注釈の値としてAvroリーダー・スキーマを指定します。オプション。

指定時に、ファイル内のオブジェクトがリーダー・スキーマにマップされます。次に例を示します。

%avro:schema('
{
"type": "record",
"name": "Person",
"fields" : [
{"name": "full_name", "type": "string"},
{"name": "age", "type": ["int", "null"] }
]
}
')

この注釈は、%avro:schema-fileまたは%avro:schema-kvと組み合せることはできません。

関連項目:

次のサイトにある『Apache Avro Specification』のスキーマ解決に関する項

http://avro.apache.org/docs/current/spec.html#Schema+Resolution

%avro:schema-file("avro-schema-uri")

%avro:schemaと似ていますが、注釈値はAvroリーダー・スキーマを含むファイルURIです。相対URIは、クライアントのローカル・ファイル・システムの現行作業ディレクトリに対して解決されます。オプション。

例, %avro:schema-file("schemas/person.avsc")

この注釈は、%avro:schemaまたは%avro:schema-kvと組み合せることはできません。

%avro:schema-kv("schema-name")

%avro:schemaと似ていますが、注釈値は完全修飾されたレコード名です。レコード・スキーマは、Oracle NoSQL Databaseカタログから取得されます。オプション。

例, %avro:schema-kv("org.example.PersonRecord")

この注釈を使用する場合は、Oracle NoSQL Databaseへの接続パラメータを指定する必要があります。「Oracle NoSQL Databaseアダプタの構成プロパティ」を参照してください。

この注釈は、%avro:schemaまたは%avro:schema-fileと組み合せることはできません。

%avro:split-max("split-size")

最大分割サイズを整数または文字列値で指定します。分割サイズによって、入力ファイルがタスクに分割される方法を制御します。Hadoopは、分割サイズをmax($split-min, min($split-max, $block-size))で計算します。オプション。

文字列値の場合、バイト(デフォルトの単位)のかわりに、K、k、M、m、Gまたはgを値に追加してキロバイト、メガバイトまたはギガバイトを表すことができます。これらの修飾子は大文字と小文字を区別しません。次の例は同等です。

%avro:split-max(1024)
%avro:split-max("1024")
%avro:split-max("1K")

%avro:split-min("split-size")

最小分割サイズを整数または文字列値で指定します。分割サイズによって、入力ファイルがタスクに分割される方法を制御します。Hadoopは、分割サイズをmax($split-min, min($split-max, $block-size))で計算します。オプション。

文字列値の場合、バイト(デフォルトの単位)のかわりに、K、k、M、m、Gまたはgを値に追加してキロバイト、メガバイトまたはギガバイトを表すことができます。これらの修飾子は大文字と小文字を区別しません。次の例は同等です。

%avro:split-min(1024)
%avro:split-min("1024")
%avro:split-min("1K")

5.1.3 Avroファイルを書き込むカスタム関数

次の注釈を使用して、Avroファイルを書き込む関数を定義できます。

シグネチャ

Avroファイルを書き込むカスタム関数には、次のシグネチャが必要です。

declare %avro:put("avroxml") [additional annotations]
local:myFunctionName($value as item()) external;

注釈

%avro:put("avroxml")

avroxml put関数を宣言します。必須。

Avroスキーマは、次のいずれかの注釈を使用して指定する必要があります。

- %avro:schema

- %avro:schema-file

- %avro:schema-kv

入力XML値はスキーマのインスタンスに変換されます。「AvroとしてのXMLの書込み」を参照してください。

%avro:schema("avro-schema")

ファイルのスキーマを指定します。次に例を示します。

%avro:schema('
{
"type": "record",
"name": "Person",
"fields" : [
{"name": "full_name", "type": "string"},
{"name": "age", "type": ["int", "null"] }
]
}
')

この注釈は、%avro:schema-fileまたは%avro:schema-kvと組み合せることはできません。

%avro:schema-file("avro-schema-uri")

%avro:schemaと似ていますが、注釈値はAvroリーダー・スキーマを含むファイルURIです。相対URIは、クライアントのローカル・ファイル・システムの現行作業ディレクトリに対して解決されます。

例: %avro:schema-file("schemas/person.avsc")

この注釈は、%avro:schemaまたは%avro:schema-kvと組み合せることはできません。

%avro:schema-kv("schema-name")

%avro:schemaと似ていますが、注釈値は完全修飾されたレコード名です。レコード・スキーマは、Oracle NoSQL Databaseカタログから取得されます。

例: %avro:schema-kv("org.example.PersonRecord")

この注釈を使用する場合は、Oracle NoSQL Databaseへの接続パラメータを指定する必要があります。「Oracle NoSQL Databaseアダプタの構成プロパティ」を参照してください。

この注釈は、%avro:schemaまたは%avro:schema-fileと組み合せることはできません。

%avro:compress("method", [level]?)

出力で使用する圧縮形式を指定します。

codecは、次のいずれかの文字列リテラル値です。

- deflate: levelは、速度と圧縮の兼合いを制御します。有効な値は1から9で、1は最速で、9は最も圧縮されます。

- snappy: このアルゴリズムは、高速で中程度の圧縮に設計されています。

デフォルトは圧縮なしです。

levelは整数値です。これはオプションで、codecがdeflateの場合のみサポートされています。

次に例を示します。

%avro:compress("snappy")
%avro:compress("deflate")
%avro:compress("deflate", 3)

%avro:file("name")

出力ファイル名の接頭辞を指定します。デフォルトの接頭辞はpartです。

5.1.4 Avroファイル・アダプタの関数の例

次の各例では、HDFS内の次のテキスト・ファイルを使用します。

mydata/ages.txt

john,45
kelly,36
laura,
mike,27

例5-1 テキスト・ファイルからAvroへの変換

次の問合せは、ファイルを圧縮済Avroコンテナ・ファイルに変換します。

import module "oxh:text";

declare
%avro:put("avroxml")
%avro:compress("snappy")
%avro:schema('
{
"type": "record",
"name": "AgeRec",
"fields" : [
{"name": "user", "type": "string"},
{"name": "age", "type": ["int", "null"] }
]
}
')
function local:put($arg as item()) external;

for $line in text:collection("mydata/ages.txt")
let $split := fn:tokenize($line, ",")
return
local:put(
<rec>
<user>{$split[1]}</user>
{
if ($split[2] castable as xs:int) then
<age>{$split[2]}</age>
else
()
}
</rec>
)

この問合せは、次のレコードを含むAvroファイルを生成します(ここではJSONと表されています)。

{"user":"john","age":{"int":45}}
{"user":"kelly","age":{"int":36}}
{"user":"laura","age":null}
{"user":"mike","age":{"int":27}}

例5-2 Avroコンテナ・ファイル内のレコードの問合せ

次の問合せは、myoutputディレクトリから、ageがnullまたは30を超えるレコードを選択します。レコードは、例5-1の問合せで生成されています。

import module "oxh:text";
import module "oxh:avro";

for $rec in avro:collection-avroxml("myoutput/part*.avro")
where $rec/age/nilled() or $rec/age gt 30
return
text:put($rec/user)

この問合せは、次の行を含むファイルを作成します。

john
kelly
laura

5.1.5 AvroとXML間の値の変換について

この項では、Oracle XQuery for HadoopがデータをAvroとXML間で変換する方法について説明します。

- XMLとしてのAvroの読取り

- AvroとしてのXMLの書込み

5.1.5.1 XMLとしてのAvroの読取り

Avroファイル・アダプタとOracle NoSQL Databaseアダプタの両方にavroxmlメソッドがあり、このメソッドとcollection関数を使用して、AvroレコードをXMLとして読み取ることができます。AvroをXMLに変換した後、XQueryを使用してデータを問い合せて変換できます。

次のトピックでは、Oracle XQuery for HadoopがAvroを読み取る方法について説明します。

- レコードの読取り

- マップの読取り

- 配列の読取り

- 共用体の読取り

- プリミティブの読取り

5.1.5.1.1 レコードの読取り

Avroレコードは、レコード内のフィールドごとに1つの子要素を持つ<oxh:item>要素に変換されます。

たとえば、次のAvroスキーマを考えてみます。

{
"type": "record",
"name": "Person",
"fields" : [
{"name": "full_name", "type": "string"},
{"name": "age", "type": ["int", "null"] }
]
}

これは、XMLとしてモデル化されたレコードのインスタンスです。

<oxh:item>
<full_name>John Doe</full_name>
<age>46</age>
</oxh:item>

AvroレコードをXMLに変換することによって、XQueryによるレコードの問合せが可能になります。次の例は、Personレコードを含むperson.avroというAvroコンテナ・ファイルを問い合せます。この問合せは、各行にfull_name値とage値を含むCSVテキスト・ファイルにレコードを変換します。

import module "oxh:avro";
import module "oxh:text";

for $x in avro:collection-avroxml("person.avro")
return
text:put($x/full_name || "," || $x/age)

null値はnilled要素に変換されます。nilled要素によってxsi:nil属性がtrueに設定されるため、常に空になります。XQueryのfn:nilled関数を使用して、レコード・フィールドがnullかどうかをテストできます。たとえば、次の問合せは、ageがnull値のPersonレコードの名前を書き込みます。

import module "oxh:avro";
import module "oxh:text";

for $x in avro:collection-avroxml("person.avro")
where $x/age/nilled()
return
text:put($x/full_name)

ネストされたレコードの場合、内部スキーマのフィールドは、外部スキーマのフィールドに対応する要素の子要素になります。たとえば、このスキーマにはネストされたレコードがあります。

{
"type": "record",
"name": "PersonAddress",
"fields" : [
{"name": "full_name", "type": "string"},
{"name": "address", "type":
{ "type" : "record",
"name" : "Address",
"fields" : [
{ "name" : "street", "type" : "string" },
{ "name" : "city", "type" : "string" }
]
}
}
]
}

これは、XMLとしてのレコードのインスタンスです。

<oxh:item>
<full_name>John Doe</full_name>
<address>
<street>123 First St.</street>
<city>New York</city>
</address>
</oxh:item>

次の例は、PersonAddressレコードを含むpeople-address.avroという名前のAvroコンテナ・ファイルを問い合せて、ニューヨーク在住の個人の名前をテキスト・ファイルに書き込みます。

import module "oxh:avro";
import module "oxh:text";

for $person in avro:collection-avroxml("examples/person-address.avro")
where $person/address/city eq "New York"
return
text:put($person/full_name)

5.1.5.1.2 マップの読取り

Avroマップ値は、マップ内のエントリごとに1つの子<oxh:entry>要素を含む要素に変換されます。たとえば、次のスキーマを考えてみます。

{
"type": "record",
"name": "PersonProperties",
"fields" : [
{"name": "full_name", "type": "string"},
{"name": "properties", "type":
{"type": "map", "values": "string"}
}
]
}

これは、XMLとしてのスキーマのインスタンスです。

<oxh:item>
<full_name>John Doe</full_name>
<properties>
<oxh:entry key="employer">Example Inc</oxh:entry>
<oxh:entry key="hair color">brown</oxh:entry>
<oxh:entry key="favorite author">George RR Martin</oxh:entry>
</properties>
</oxh:item>

次の例では、PersonAddressレコードを含むperson-properties.avroという名前のファイルを問い合せて、Example Inc.社に雇用された人の名前を書き込みます。この問合せは、XPath正規表現によってどのようにマップ・エントリを取得できるかを示しています。さらに、avro:get関数をショートカットとして使用して、マップ・エントリを取得することもできます。

import module "oxh:avro";
import module "oxh:text";

for $person in avro:collection-avroxml("person-properties.avro")
where $person/properties/oxh:entry[@key eq "employer"] eq "Example Inc"
return
text:put($person/full_name)

次の問合せは、avro:get関数を使用して、employerエントリを取得します。これは、前の問合せと同等です。

import module "oxh:avro";
import module "oxh:text";

for $person in avro:collection-avroxml("person-properties.avro")
where $person/properties/avro:get("employer") eq "Example Inc"
return
text:put($person/full_name)

XQueryのfn:nilled関数を使用して、null値をテストできます。次の例は、マップ・エントリがnullの場合にtrueを返します。

$var/avro:get("key")/nilled()

5.1.5.1.3 配列の読取り

Oracle XQuery for Hadoopは、Avro配列値を、配列内の項目ごとに子<oxh:item>要素を含む要素に変換します。たとえば、次のスキーマを考えてみます。

{
"type": "record",
"name": "PersonScores",
"fields" : [
{"name": "full_name", "type": "string"},
{"name": "scores", "type":
{"type": "array", "items": "int"}
}
]
}

これは、XMLとしてのスキーマのインスタンスです。

<oxh:item>
<full_name>John Doe</full_name>
<scores>
<oxh:item>128</oxh:item>
<oxh:item>151</oxh:item>
<oxh:item>110</oxh:item>
</scores>
</oxh:item>

次の例は、PersonScoresレコードを含むperson-scores.avroという名前のファイルを問い合せて、個人ごとのスコアの合計と件数を書き込みます。

import module "oxh:avro";
import module "oxh:text";

for $person in avro:collection-avroxml("person-scores.avro")
let $scores := $person/scores/*
return
text:put($person/full_name || "," || sum($scores) || "," || count($scores))

数値のXPath述語を使用すると、配列の特定の要素にアクセスできます。たとえば、このパス式は2番目のスコアを選択します。XPath索引は(0ではなく)1から始まります。

$person/scores/oxh:item[2]

5.1.5.1.4 共用体の読取り

Oracle XQuery for Hadoopは、値の実際のメンバー・タイプに基づいて、Avro共用体タイプのインスタンスを変換します。メンバー・タイプの名前はXML avro:type属性として包含する要素に追加されるため、問合せでは異なるメンバー・タイプのインスタンスを識別できます。ただし、メンバー・タイプが2つのみで、そのいずれかがnullの単純な共用体の場合、属性は追加されません。

たとえば、2つのレコードの次の共用体を考えてみます。

[
{
"type": "record",
"name": "Person1",
"fields" : [
{"name": "full_name", "type": "string"}
]
}
,
{
"type": "record",
"name": "Person2",
"fields" : [
{"name": "fname", "type": "string"}
]
}
]

これは、XMLとしてのスキーマのインスタンスです。

<oxh:item avro:type="Person2">
<fname>John Doe</fname>
</oxh:item>

次の例は、前の共用体スキーマのインスタンスを含むperson-union.avroという名前のファイルを問い合せて、両方のレコード・タイプから個人の名前をテキスト・ファイルに書き込みます。

import module "oxh:avro";
import module "oxh:text";

for $person in avro:collection-avroxml("examples/person-union.avro")
return
if ($person/@avro:type eq "Person1") then
text:put($person/full_name)
else if ($person/@avro:type eq "Person2") then
text:put($person/fname)
else
error(xs:QName("UNEXPECTED"), "Unexpected record type:" || $person/@avro:type)

5.1.5.1.5 プリミティブの読取り

表5-1に、Oracle XQuery for HadoopがAvroプリミティブ・タイプをXQueryアトミック・タイプにマップする方法を示します。

表5-1 Avroプリミティブ・タイプからXQueryアトミック・タイプへのマッピング

Avro

XQuery

boolean

xs:boolean

int

xs:int

long

xs:long

float

xs:float

double

xs:double

bytes

xs:hexBinary

string

xs:string

Avro null値は空のnilled要素にマップされます。nullの文字列値と空の文字列値を識別するには、XQueryのnilled関数を使用します。このパス式は、フィールド値がnullの場合のみtrueを返します。

$record/field/fn:nilled()

Avro固定値はxs:hexBinaryにマップされ、enumsはxs:stringにマップされます。

5.1.5.2 AvroとしてのXMLの書込み

Avroファイル・アダプタとOracle NoSQL Databaseアダプタの両方にavroxmlメソッドがあり、このメソッドとput関数を使用してXMLをAvroとして書き込むことができます。次のトピックでは、XMLをAvroインスタンスに変換する方法について説明します。

- レコードの書込み

- マップの書込み

- 配列の書込み

- 共用体の書込み

- プリミティブの書込み

5.1.5.2.1 レコードの書込み

Oracle XQuery for Hadoopは、子要素名とレコードのフィールド名を照合してXMLをAvroレコード・スキーマにマップします。たとえば、次のAvroスキーマを考えてみます。

{
"type": "record",
"name": "Person",
"fields" : [
{"name": "full_name", "type": "string"},
{"name": "age", "type": ["int", "null"] }
]
}

次のXML要素を使用して、full_nameフィールドがJohn Doeでageフィールドが46のレコードのインスタンスを書き込むことができます。ルート要素の名前(Person)は重要ではありません。子要素の名前のみを使用して、Avroレコード・フィールド(full_nameおよびage)にマップされます。

<person>
<full_name>John Doe</full_name>
<age>46</age>
</person>

次の例では、people.csvという名前の次のCSVファイルを使用します。

John Doe,46
Jane Doe,37
.
.
.

この問合せは、CSVファイルからAvro Personレコードに値を変換します。

import module "oxh:avro";
import module "oxh:text";

declare
%avro:put("avroxml")
%avro:schema('
{
"type": "record",
"name": "Person",
"fields" : [
{"name": "full_name", "type": "string"},
{"name": "age", "type": ["int", "null"] }
]
}
')
function local:put-person($person as element()) external;

for $line in text:collection("people.csv")
let $split := tokenize($line, ",")
return
local:put-person(
<person>
<full_name>{$split[1]}</full_name>
<age>{$split[2]}</age>
</person>
)

null値の場合は、要素を省略するか、xsi:nil="true"属性を設定できます。たとえば、この変更した問合せは、値が数値でない場合にageをnullに設定します。

.
.
.
for $line in text:collection("people.csv")
let $split := tokenize($line, ",")
return
local:put-person(
<person>
<full_name>{$split[1]}</full_name>
{
if ($split[2] castable as xs:int) then
<age>{$split[2]}</age>
else
()
}
</person>
)

ネストされたレコードの場合、値はネストされた要素から取得されます。次の例では、次のスキーマを使用します。

{
"type": "record",
"name": "PersonAddress",
"fields" : [
{"name": "full_name", "type": "string"},
{"name": "address", "type":
{ "type" : "record",
"name" : "Address",
"fields" : [
{ "name" : "street", "type" : "string" },
{ "name" : "city", "type" : "string" }
]
}
}
]
}

次のXMLを使用して、このレコードのインスタンスを書き込むことができます。

<person>
<full_name>John Doe</full_name>
<address>
<street>123 First St.</street>
<city>New York</city>
</address>
</person>

5.1.5.2.2 マップの書込み

Oracle XQuery for Hadoopは、XMLを、<oxh:entry>子要素ごとに1つのマップ・エントリを持つAvroマップに変換します。たとえば、次のスキーマを考えてみます。

{
"type": "record",
"name": "PersonProperties",
"fields" : [
{"name": "full_name", "type": "string"},
{"name": "properties", "type":
{"type": "map", "values": "string"}
}
]
}

次のXML要素を使用して、full_nameフィールドがJohn Doeでpropertiesフィールドが3つのエントリを持つマップに設定されたスキーマのインスタンスを書き込むことができます。

<person>
<full_name>John Doe</full_name>
<properties>
<oxh:entry key="hair color">brown</oxh:entry>
<oxh:entry key="favorite author">George RR Martin</oxh:entry>
<oxh:entry key="employer">Example Inc</oxh:entry>
</properties>
</person>

5.1.5.2.3 配列の書込み

Oracle XQuery for Hadoopは、XMLを、<oxh:item>子要素ごとに1つの項目を持つAvro配列に変換します。たとえば、次のスキーマを考えてみます。

{
"type": "record",
"name": "PersonScores",
"fields" : [
{"name": "full_name", "type": "string"},
{"name": "scores", "type":
{"type": "array", "items": "int"}
}
]
}

次のXML要素を使用して、full_nameフィールドがJohn Doeでscoresフィールドが[128、151、110]に設定されたスキーマのインスタンスを書き込むことができます。

<person>
<full_name>John Doe</full_name>
<scores>
<oxh:item>128</oxh:item>
<oxh:item>151</oxh:item>
<oxh:item>110</oxh:item>
</scores>
</person>

5.1.5.2.4 共用体の書込み

Avro共用体タイプを書き込むとき、Oracle XQuery for Hadoopはavro:type属性の値に基づいてメンバー・タイプを選択します。

この例では、次のスキーマを使用します。

[
{
"type": "record",
"name": "Person1",
"fields" : [
{"name": "full_name", "type": "string"}
]
}
,
{
"type": "record",
"name": "Person2",
"fields" : [
{"name": "fname", "type": "string"}
]
}
]

次のXMLは、Person1レコードのインスタンスにマップされます。

<person avro:type="Person1">
<full_name>John Doe</full_name>
</person>

このXMLは、Person2レコードのインスタンスにマップされます。

<person avro:type="Person2">
<fname>John Doe</fname>
</person>

avro:type属性では、共用体のメンバー・タイプを選択します。nullと他のタイプを1つずつ含む単純な共用体の場合、avro:type属性は不要です。メンバー・タイプが判別できない場合は、エラーが発生します。

5.1.5.2.5 プリミティブの書込み

プリミティブ値をマップするために、Oracle XQuery for Hadoopは表5-1に示す同等のデータ型を使用して、XML値を対応するAvroタイプにキャストします。値をAvroタイプに変換できない場合は、エラーが発生します。

この例では、次のスキーマを使用します。

{
"type": "record",
"name": "Person",
"fields" : [
{"name": "full_name", "type": "string"},
{"name": "age", "type": ["int", "null"] }
]
}

string値appleをintに変換できないため、次のXMLをこのスキーマのインスタンスにマップしようとするとエラーが発生します。

<person>
<full_name>John Doe</full_name>
<age>apple</age>
</person>

5.2 JSONファイル・アダプタ

JSONファイル・アダプタは、HDFSに格納されたJSONファイルへのアクセスを提供します。他のファイル形式で埋め込まれているJSONデータを処理するための関数も含まれています。たとえば、大規模なテキスト・ファイルに行として格納されているJSONを問い合せるには、json:parse-as-xmlおよびtext:collection関数を使用します。

現在、単一のJSONファイルの並列処理はサポートされていません。一連のJSONファイルの並列処理は、各ファイルを順次処理して行うことができます。

JSONモジュールについては、次のトピックを参照してください。

- JSONを読み取る組込み関数

- JSONファイルを読み取るカスタム関数

- JSON関数の例

- JSONファイル・アダプタの構成プロパティ

- XMLへのJSONデータ形式の変換について

5.2.1 JSONを読み取る組込み関数

問合せで組込み関数を使用するには、次のようにJSONファイル・モジュールをインポートする必要があります。

import module "oxh:json";

JSONモジュールには、次の関数が含まれています。

- json:collection-jsonxml

- json:parse-as-xml

- json:get

5.2.1.1 json:collection-jsonxml

HDFS内のJSONファイルのコレクションにアクセスします。複数のファイルを同時に処理できますが、個々のファイルは1つのタスクによって解析されます。

Hadoopでサポートされている圧縮コーデックを使用して圧縮されたファイルは、JSONファイル・アダプタによって自動的に解凍されます。

シグネチャ

json:collection-jsonxml($uris as xs:string*) as element()* external;

パラメータ

$uris: JSONファイルのURI

戻り値

JSON値をモデル化するXML要素。「XMLへのJSONデータ形式の変換について」を参照してください。

5.2.1.2 json:parse-as-xml

JSON値をXMLとして解析します。

シグネチャ

json:parse-as-xml($arg as xs:string?) as element(*)?

パラメータ

$arg: 空の順序を指定できます。

戻り値

JSON値をモデル化するXML要素。$argが空の順序の場合は、空の順序です。「XMLへのJSONデータ形式の変換について」を参照してください。

5.2.1.3 json:get

XMLとしてモデル化されたJSONオブジェクトからエントリを取得します。「XMLへのJSONデータ形式の変換について」を参照してください。

シグネチャ

json:get($key as xs:string?, $obj as node()?) as element(oxh:entry)?

json:get($key as xs:string?) as element(oxh:entry)?

パラメータ

$key: JSONデータ・キー

$obj: JSONオブジェクト値

戻り値

次のXPath式の値。

$obj/oxh:entry[@key eq $key]

$inputが存在しない場合、動作は、2つの引数の関数を呼び出して$objのコンテキスト項目を使用するのと同じです。「注意」を参照してください。

注意

次の関数呼出しは同等です。

$var/json:get("key")

json:get("key", $var)

$var/oxh:entry[@key eq "key"]

$varは、XMLとしてモデル化されたJSONオブジェクトです。「マップの読取り」を参照してください。

5.2.2 JSONファイルを読み取るカスタム関数

次の注釈を使用して、HDFS内のJSONファイルのコレクションを読み取る関数を定義できます。これらの注釈によって、組込み関数では使用できない追加機能を使用できます。

シグネチャ

JSONファイルを読み取るカスタム関数には、次のシグネチャが必要です。

declare %json:collection("jsonxml") [additional annotations]
function local:myFunctionName($uris as xs:string*) as element()* external;

注釈

%json:collection("jsonxml")

collection関数を宣言します。注釈パラメータはjsonxmlである必要があります。

%output:encoding("charset")

入力ファイルのテキスト・エンコードを識別します。

有効なエンコードは、JVMでサポートされているエンコードです。この注釈を省略すると、エンコードは、UTF-8、UTF-16のビッグエンディアン・シリアライズ(BE)またはリトルエンディアン・シリアライズ(LE)、UTF-32 (BEまたはLE)としてJSONファイルから自動的に検出されます。

パフォーマンスを向上させるには、次のInternet Engineering Task Force (IETF)のWebサイトにある『JSON Request for Comment 4627』のエンコードに関する項に従って実際のファイル・エンコードを指定する場合に、エンコードの注釈を省略します。

http://www.ietf.org/rfc/rfc4627.txt

パラメータ

$uris as xs:string*

JSONファイルのURIをリストします。必須。

戻り値

XML要素のコレクション。各要素は対応するJSON値をモデル化します。「XMLへのJSONデータ形式の変換について」を参照してください。

5.2.3 JSON関数の例

例5-3では、HDFSに格納されている次のJSONテキスト・ファイルを使用します。

mydata/users1.json
[
{ "user" : "john", "full name" : "John Doe", "age" : 45 },
{ "user" : "kelly", "full name" : "Kelly Johnson", "age" : 32 }
]

mydata/users2.json
[
{ "user" : "laura", "full name" : "Laura Smith", "age" : null },
{ "user" : "phil", "full name" : "Phil Johnson", "age" : 27 }
]

残りの例では、HDFS内の次のテキスト・ファイルを問い合せます。

mydata/users-json.txt

{ "user" : "john", "full name" : "John Doe", "age" : 45 }
{ "user" : "kelly", "full name" : "Kelly Johnson", "age" : 32 }
{ "user" : "laura", "full name" : "Laura Smith", "age" : null }
{ "user" : "phil", "full name" : "Phil Johnson", "age" : 27 }

例5-3

次の問合せは、姓がJohnsonであるユーザーの名前をusers1.jsonおよびusers2.jsonから選択します。

import module "oxh:text";
import module "oxh:json";

for $user in json:collection-jsonxml("mydata/users*.json")/oxh:item
let $fullname := $user/json:get("full name")
where tokenize($fullname, "\s+")[2] eq "Johnson"
return
text:put-text($fullname)

この問合せは、次の行を含むテキスト・ファイルを生成します。

Phil Johnson
Kelly Johnson

例5-4

次の問合せは、30歳を超えるユーザーの名前をusers-json.txtから選択します。

import module "oxh:text";
import module "oxh:json";

for $line in text:collection("mydata/users-json.txt")
let $user := json:parse-as-xml($line)
where $user/json:get("age") gt 30
return
text:put($user/json:get("full name"))

この問合せは、次の行を含むテキスト・ファイルを生成します。

John Doe
Kelly Johnson

例5-5

次の問合せは、age値がnullの従業員の名前をusers-json.txtから選択します。

import module "oxh:text";
import module "oxh:json";

for $line in text:collection("mydata/users-json.txt")
let $user := json:parse-as-xml($line)
where $user/json:get("age")/nilled()
return
text:put($user/json:get("full name"))

この問合せは、次の行を含むテキスト・ファイルを生成します。

Laura Smith

5.2.4 JSONファイル・アダプタの構成プロパティ

Oracle XQuery for Hadoopでは、構成プロパティを指定する汎用オプションをhadoopコマンドで使用します。構成ファイルを指定する場合は-confオプションを使用し、個別のプロパティを指定する場合は-Dオプションを使用します。「問合せの実行」を参照してください。

次の構成プロパティは、同じ名前のJacksonパーサー・オプションと同等です。オプション名は、大文字で入力しても小文字で入力してもかまいません。たとえば、oracle.hadoop.xquery.json.parser.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTERとoracle.hadoop.xquery.json.parser.allow_backslash_escaping_any_characterは同じです。

oracle.hadoop.xquery.json.parser.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER

型: Boolean

デフォルト値: false

説明: 文字をバックスラッシュ(\)でエスケープできます。それ以外の場合は、次の文字のみをエスケープできます: 引用符(")、スラッシュ(/)、バックスラッシュ(\)、バックスペース、フォーム・フィード(f)、改行(n)、キャリッジ・リターン(r)、水平タブ(t)および16進表現(unnnn)。

oracle.hadoop.xquery.json.parser.ALLOW_COMMENTS

型: Boolean

デフォルト値: false

説明: 解析されたテキスト内でJavaおよびC++のコメント(/* and //)を使用できます。

oracle.hadoop.xquery.json.parser.ALLOW_NON_NUMERIC_NUMBERS

型: Boolean

デフォルト値: false

説明: 非数(NaN)トークンを浮動小数点値として解析できます。

oracle.hadoop.xquery.json.parser.ALLOW_NUMERIC_LEADING_ZEROS

型: Boolean

デフォルト値: false

説明: 整数値を、00001などゼロで始めることができます。ゼロによって値が変わることはなく、ゼロは無視できます。

oracle.hadoop.xquery.json.parser.ALLOW_SINGLE_QUOTES

型: Boolean

デフォルト値: false

説明: 一重引用符(')で文字列値を区切ることができます。

oracle.hadoop.xquery.json.parser.ALLOW_UNQUOTED_CONTROL_CHARS

型: Boolean

デフォルト値: false

説明: JSON文字列に引用符で囲まれていない制御文字(つまり、タブやライン・フィードなど、32未満の10進値であるASCII文字)を含めることができます。

oracle.hadoop.xquery.json.parser.ALLOW_UNQUOTED_FIELD_NAMES

型: Boolean

デフォルト値: false

説明: 引用符で囲まれていないフィールド名を使用できます。これは、JSON仕様ではなく、Javascriptによって許可されます。

5.2.5 XMLへのJSONデータ形式の変換について

この項では、JSONデータ形式がどのようにXMLに変換されるかについて説明します。この項の内容は次のとおりです。

- JSONオブジェクトからXMLへの変換について

- JSON配列からXMLへの変換について

- 他のJSONタイプの変換について

5.2.5.1 JSONオブジェクトからXMLへの変換について

JSONオブジェクトはAvroマップに似ており、同じXML構造に変換されます。「マップの読取り」を参照してください。

たとえば、次のJSONオブジェクトがXML要素に変換されます。

{
"user" : "john",
"full_name" : "John Doe",
"age" : 45
}

オブジェクトは次の要素としてモデル化されます。

<oxh:item>
<oxh:entry key="user">john</oxh:entry>
<oxh:entry key="full_name">John Doe</oxh:entry>
<oxh:entry key="age">45</oxh:entry>
</oxh:item>

5.2.5.2 JSON配列からXMLへの変換について

JSON配列はAvro配列に似ており、同じXML構造に変換されます。「配列の読取り」を参照してください。

たとえば、次のJSON配列がXML要素に変換されます。

[ "red", "blue", "green" ]

配列は次の要素としてモデル化されます。

<oxh:item>
<oxh:item>red</oxh:item>
<oxh:item>blue</oxh:item>
<oxh:item>green</oxh:item>
</oxh:item>

5.2.5.3 他のJSONタイプの変換について

他のJSON値は、表5-2に示すようにマップされます。

表5-2 JSONタイプの変換

JSON

XML

null

空(nilled)の要素

true/false

xs:boolean

number

xs:decimal

string

xs:string

5.3 Oracle Databaseアダプタ

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のインストール」のステップ3を参照してください。必須ではありませんが、このアダプタを使用する前に、Oracle Loader for Hadoopをよく理解しておくと役立ちます。

次のトピックでは、Oracle Databaseアダプタについて説明します。

- Oracle Databaseに書き込むカスタム関数

- Oracle Databaseアダプタの関数の例

- Oracle Loader for Hadoop構成プロパティおよび対応する%oracle-property注釈

関連項目:

- Oracle Loader for HadoopでサポートされるOracle Databaseのバージョンについては、「ソフトウェア要件」

- Oracle Loader for Hadoop

5.3.1 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;

注釈

%oracle:put("output_mode"?)

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システムに接続できる必要があります。「操作モードの概要」を参照してください。

%oracle:columns(col1 [, col2])

ターゲット表で選択された1つ以上の列名を識別します。列名の順序は、関数パラメータの順序に対応します。「パラメータ」を参照してください。オプション。

この注釈により、表列のサブセットのロードが可能になります。省略すると、put関数はターゲット表のすべての列をロードしようとします。

%oracle-property:property_name (value)

データベースへの接続およびデータの書込みの様々な側面を制御します。複数の%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')

パラメータ

$column1 [as xs:allowed_type_name[?]], [$column2 [as xs:allowed_type_name[?]]]

すべての列をロードするには、Oracle表の列と同じ順序で各列のパラメータを入力し、選択した列をロードするには、%oracle:columns注釈を使用します。

パラメータとデータベース列の関係は位置によって決まるため、パラメータの名前(パラメータ構文のcolumn1)はデータベース列の名前と一致する必要はありません。

任意のパラメータで明示的なas xs:allowed_type_nameタイプ宣言は省略できます。たとえば、NUMBER列に対応するパラメータを単に$column1として宣言できます。この場合、パラメータはXQueryタイプのitem()*に自動的に割り当てられます。表5-3に説明するように、入力値は実行時に、対応する表列タイプに対して許容されるXQueryタイプにキャストされます。たとえば、NUMBERデータ型の列にマップされるデータ値は、xs:decimalとして自動的にキャストされます。キャストが失敗すると、エラーが発生します。

あるいは、パラメータのタイプまたはそのサブタイプを指定できます。この場合、コンパイル時タイプのチェックが実行されます。たとえば、NUMBER列に対応するパラメータを$column as xs:decimalとして宣言できます。また、xs:decimalのサブタイプ(xs:integerなど)として宣言することもできます。

指定する各パラメータ・タイプにオプションのオカレンス・インジケータ?を含めることができます。このインジケータを使用すると、実行時に空の順序をパラメータ値として渡すことができ、nullがデータベース表に挿入されます。?以外のオカレンス・インジケータを使用するとコンパイル時エラーが発生します。

表5-3に、サポートされているOracle Databaseデータ型に対するXQueryデータ型の適切なマッピングを示します。リストされているXQueryデータ型に加えて、xs:decimalのかわりにxs:integerを使用するなど、サブタイプも使用できます。Oracleデータ型はXQueryデータ型よりも制限があるため、表ではその制限を説明しています。

表5-3 Oracle DatabaseとXQuery間のデータ型マッピング

Database型

XQuery型

VARCHAR2

xs:string

VARCHAR2の最大サイズ4000バイトに制限されます。

CHAR

xs:string

CHARの最大サイズ2000バイトに制限されます。

NVARCHAR2

xs:string

NVARCHAR2の最大サイズ4000バイトに制限されます。

NCHAR

xs:string

NCHARの最大サイズ2000バイトに制限されます。

DATE

xs:dateTime

紀元前4712年1月1日から西暦9999年12月31日の範囲に制限されます。xs:dateTime値にタイムゾーンが指定された場合、そのタイムゾーン情報は削除されます。小数秒も削除されます。時間値24:00:00は有効ではありません。

TIMESTAMP

xs:dateTime

紀元前4712年1月1日から西暦9999年12月31日の範囲に制限されます。xs:dateTime値にタイムゾーンが指定された場合、そのタイムゾーン情報は削除されます。小数秒の精度は0から9桁に制限されます。時間値24:00:00は有効ではありません。

TIMESTAMP W LOCAL TIME ZONE

xs:dateTime

紀元前4712年1月1日から西暦9999年12月31日の範囲に制限されます。協定世界時からのオフセットで、タイムゾーン時間フィールドは-12:00から14:00に制限されます。小数秒の精度は0から9桁に制限されます。

「セッション・タイムゾーンについて」を参照してください。

TIMESTAMP W TIME ZONE

xs:dateTime

紀元前4712年1月1日から西暦9999年12月31日の範囲に制限されます。協定世界時からのオフセットで、タイムゾーン時間フィールドは-12:00から14:00に制限されます。小数秒の精度は0から9桁に制限されます。

「セッション・タイムゾーンについて」を参照してください。

INTERVAL DAY TO SECOND

xs:dateTimeDuration

日および小数秒の精度は、それぞれ0から9桁に制限されます。時間は0から23、分と秒は0から59の範囲に制限されます。

INTERVAL YEAR TO MONTH

xs:yearMonthDuration

年の精度は0から9桁に制限され、月は0から11の範囲に制限されます。

BINARY_FLOAT

xs:float

BINARY_DOUBLE

xs:double

NUMBER

xs:decimal

NUMBERの精度は10進数の1から38、スケールは10進数の-84から127に制限されます。

FLOAT

xs:decimal

FLOATの精度は2進数の1から126に制限されます。

RAW

xs:hexBinary

RAWの最大サイズ2000バイトに制限されます。

セッション・タイムゾーンについて

タイムゾーンが指定されていない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出力形式」を参照してください。

5.3.2 Oracle Databaseアダプタの関数の例

次の各例では、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)

例5-6 すべての列のロード

最初の問合せは、ページ・アクセスに関連するすべての情報(アクセスの時間、ユーザー名、アクセスしたページ、およびステータス・コード)を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

例5-7 選択した列のロード

この例では、%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

5.3.3 Oracle Loader for Hadoop構成プロパティおよび対応する%oracle-property注釈

Oracle XQuery for HadoopのOracle Databaseアダプタを使用するときは、Oracle Loader for Hadoopを間接的に使用します。Oracle Loader for Hadoopは、Oracle Databaseへの接続およびデータの書込みの様々な側面を制御する構成プロパティを定義します。Oracle XQuery for Hadoopは、これらのプロパティ(表5-4の最後の列を参照)の多くをサポートしています。

これらのプロパティは、汎用の-confおよび-D hadoopコマンドライン・オプションを使用してOracle XQuery for Hadoopに指定できます。この方法を使用して指定されるプロパティは、問合せ内のOracle Databaseアダプタのすべてのput関数に適用されます。hadoopコマンドライン・オプションの詳細は、「問合せの実行」、特に「汎用オプション」を参照してください。

あるいは、%oracle-property接頭辞を使用して、これらのプロパティをOracle Databaseアダプタのput関数の注釈として指定できます。これらの注釈は、表5-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注釈を使用して、異なる表名を設定します。

表5-4に、Oracle Loader for Hadoopプロパティおよびそれと同等のOracle XQuery for Hadoop注釈を機能カテゴリ別に示します。Oracle XQuery for Hadoopは、この表に示されているOracle Loader for Hadoopプロパティのみサポートしています。

表5-4 構成プロパティおよび対応する%oracle-property注釈

カテゴリ

プロパティ

注釈

接続

oracle.hadoop.loader.connection.defaultExecuteBatch

%oracle-property:connection.defaultExecuteBatch

接続

oracle.hadoop.loader.connection.oci_url

%oracle-property:connection.oci_url

接続

oracle.hadoop.loader.connection.password

%oracle-property:connection.password

接続

oracle.hadoop.loader.connection.sessionTimeZone

%oracle-property:connection.sessionTimeZone

接続

oracle.hadoop.loader.connection.tns_admin

%oracle-property:connection.tns_admin

接続

oracle.hadoop.loader.connection.tnsEntryName

%oracle-property:connection.tnsEntryName

接続

oracle.hadoop.loader.connection.url

%oracle-property:connection.url

接続

oracle.hadoop.loader.connection.user

%oracle-property:connection.user

接続

oracle.hadoop.loader.connection.wallet_location

%oracle-property:connection.wallet_location

一般

oracle.hadoop.loader.badRecordFlushInterval

%oracle-property:badRecordFlushInterval

一般

oracle.hadoop.loader.compressionFactors

%oracle-property:compressionFactors

一般

oracle.hadoop.loader.enableSorting

%oracle-property:enableSorting

一般

oracle.hadoop.loader.extTabDirectoryName

%oracle-property:extTabDirectoryName

一般

oracle.hadoop.loader.loadByPartition

%oracle-property:loadByPartition

一般

oracle.hadoop.loader.logBadRecords

%oracle-property:logBadRecords

一般

oracle.hadoop.loader.rejectLimit

%oracle-property:rejectLimit

一般

oracle.hadoop.loader.sortKey

%oracle-property:sortKey

一般

oracle.hadoop.loader.tableMetadataFile

%oracle-property:tableMetadataFile

一般

oracle.hadoop.loader.targetTable

%oracle-property:targetTable

出力

oracle.hadoop.loader.output.dirpathBufsize

%oracle-property:dirpathBufsize

出力

oracle.hadoop.loader.output.escapeEnclosers

%oracle-property:output.escapeEnclosers

出力

oracle.hadoop.loader.output.fieldTerminator

%oracle-property:output.fieldTerminator

出力

oracle.hadoop.loader.output.granuleSize

%oracle-property:output.granuleSize

出力

oracle.hadoop.loader.output.initialFieldEncloser

%oracle-property:output.initialFieldEncloser

出力

oracle.hadoop.loader.output.trailingFieldEncloser

%oracle-property:output.trailingFieldEncloser

サンプラ

oracle.hadoop.loader.sampler.enableSampling

%oracle-property:sampler.enableSampling

サンプラ

oracle.hadoop.loader.sampler.hintMaxSplitSize

%oracle-property:sampler.hintMaxSplitSize

サンプラ

oracle.hadoop.loader.sampler.hintNumMapTasks

%oracle-property:sampler.hintNumMapTask

サンプラ

oracle.hadoop.loader.sampler.loadCI

%oracle-property:sampler.loadCI

サンプラ

oracle.hadoop.loader.sampler.maxHeapBytes

%oracle-property:sampler.maxHeapBytes

サンプラ

oracle.hadoop.loader.sampler.maxLoadFactor

%oracle-property:sampler.maxLoadFactor

サンプラ

oracle.hadoop.loader.sampler.maxSamplesPct

%oracle-property:sampler.maxSamplesPct

サンプラ

oracle.hadoop.loader.sampler.minSplits

%oracle-property:sampler.minSplits

サンプラ

oracle.hadoop.loader.sampler.numThreads

%oracle-property:sampler.numThreads

5.4 Oracle NoSQL Databaseアダプタ

このアダプタは、Oracle NoSQL Databaseに格納する値の読取りおよび書込みを実行する関数を提供します。

次のトピックでは、このアダプタについて説明します。

- Oracle NoSQL Databaseアダプタを使用するための前提条件

- Oracle NoSQL Databaseに対して読取りおよび書込みを実行する組込み関数

- 表APIを使用してOracle NoSQL Databaseに対して読取りおよび書込みを実行する組込み関数

- Oracle NoSQL Databaseから値を読み取るカスタム関数

- Oracle NoSQL Databaseから単一値を取得するためのカスタム関数

- 表APIを使用してOracle NoSQL Databaseから値を読み取るカスタム関数

- 表APIを使用してOracle NoSQL Databaseから単一列を読み取るカスタム関数

- ラージ・オブジェクトAPIを使用してOracle NoSQL Databaseから単一値を取得するためのカスタム関数

- Oracle NoSQL Databaseに書き込むカスタム関数

- 表APIを使用してOracle NoSQL Databaseに値を書き込むカスタム関数

- ラージ・オブジェクトAPIを使用してOracle NoSQL Databaseに値を書き込むカスタム関数

- Oracle NoSQL Databaseアダプタの関数の例

- Oracle NoSQL Databaseアダプタの構成プロパティ

5.4.1 Oracle NoSQL Databaseアダプタを使用するための前提条件

Oracle NoSQL Databaseアダプタを使用する問合せを記述する前に、Oracle NoSQL Databaseサーバーを使用するようにOracle XQuery for Hadoopを構成する必要があります。

次を設定する必要があります。

- Oracle NoSQL Databaseのlibディレクトリを含むローカル・ディレクトリへのKVHOME環境変数。

- oracle.kv.hostsおよびoracle.kv.kvstore構成プロパティ。

- Tikaパーサーが呼び出されるときのみの、search-mr-version.jarおよびsearch-mr-version-job.jarを含むローカル・ディレクトリに対するOXH_SOLR_MR_HOME環境変数。つまり、kv:collection-tika()関数またはkv:get-tika()関数が呼び出されるとき、あるいは外部関数で%kv:collection('tika')注釈または%kv:get('tika')注釈が使用されるときのみです。

構成プロパティは、問合せの実行時にhadoopコマンドで-Dオプションまたは-confオプションを使用すると設定できます。「問合せの実行」を参照してください。

次の例は、KVHOMEを設定し、問合せでhadoop -Dオプションを使用してoracle.kv.kvstoreを設定します。

$ export KVHOME=/local/path/to/kvstore/
$ hadoop jar $OXH_HOME/lib/oxh.jar -D oracle.kv.hosts=example.com:5000 -D oracle.kv.kvstore=kvstore ./myquery.xq -output ./myoutput

この例では、Tikaパーサーが呼び出されるときのOXH_SOLR_MR_HOME環境変数を設定します。

$ export OXH_SOLR_MR_HOME=/usr/lib/solr/contrib/mr

注意:

HADOOP_CLASSPATH環境変数または-libjarsコマンドライン・オプションには、NoSQL DB jarsは含まれません。

「Oracle NoSQL Databaseアダプタの構成プロパティ」を参照してください。

5.4.2 Oracle NoSQL Databaseに対して読取りおよび書込みを実行する組込み関数

問合せで組込み関数を使用するには、次のようにOracle NoSQL Databaseモジュールをインポートする必要があります。

import module "oxh:kv";

Oracle NoSQL Databaseモジュールには、次の関数が含まれています。

- kv:collection-text

- kv:collection-avroxml

- kv:collection-xml

- kv:collection-binxml

- kv:collection-tika

- kv:put-text

- kv:put-xml

- kv:put-binxml

- kv:get-text

- kv:get-avroxml

- kv:get-xml

- kv:get-binxml

- kv:get-tika

- kv:key-range

5.4.2.1 kv:collection-text

データベース内の値のコレクションにアクセスします。各値はUTF-8としてデコードされ、文字列として返されます。

シグネチャ

declare %kv:collection("text") function
kv:collection-text($parent-key as xs:string?, $depth as xs:int?, $subrange as xs:string?) as xs:string* external;

declare %kv:collection("text") function
kv:collection-text($parent-key as xs:string?, $depth as xs:int?) as xs:string* external;

declare %kv:collection("text") function
kv:collection-text($parent-key as xs:string?) as xs:string* external;

パラメータ

「パラメータ」を参照してください。$subrangeを省略すると、$subrange()を指定したことと同じになります。同様に、$depthを省略すると、$depth()を指定したのと同じです。

戻り値

各値に対して1つの文字列

5.4.2.2 kv:collection-avroxml

データベース内の値のコレクションにアクセスします。各値はAvroレコードとして読み取られ、XML要素として返されます。レコードはXMLに変換されます(「レコードの読取り」を参照)。

シグネチャ

declare %kv:collection("avroxml") function
kv:collection-avroxml($parent-key as xs:string?, $depth as xs:int?, $subrange as xs:string?) as element()* external;

declare %kv:collection("avroxml") function
kv:collection-avroxml($parent-key as xs:string?, $depth as xs:int?) as element()* external;

declare %kv:collection("avroxml") function
kv:collection-avroxml($parent-key as xs:string?) as element()* external;

パラメータ

「パラメータ」を参照してください。$subrangeを省略すると、$subrange()を指定したことと同じになります。同様に、$depthを省略すると、$depth()を指定したのと同じです。

戻り値

各Avroレコードに対して1つのXML要素

5.4.2.3 kv:collection-xml

データベース内の値のコレクションにアクセスします。各値は一連のバイトとして読み取られ、XMLとして解析されます。

シグネチャ

declare %kv:collection("xml") function
kv:collection-xml($parent-key as xs:string?, $depth as xs:int?, $subrange as xs:string?) as document-node()* external;

declare %kv:collection("xml") function
kv:collection-xml($parent-key as xs:string?, $depth as xs:int?) as document-node()* external;

declare %kv:collection("xml") function
kv:collection-xml($parent-key as xs:string?) as document-node()* external;

パラメータ

「パラメータ」を参照してください。$subrangeを省略すると、$subrange()を指定したことと同じになります。同様に、$depthを省略すると、$depth()を指定したのと同じです。

戻り値

各値に対して1つのXMLドキュメント。

5.4.2.4 kv:collection-binxml

データベース内の値のコレクションにアクセスします。各値はXDKバイナリXMLとして読み取られ、XMLドキュメントとして返されます。

シグネチャ

declare %kv:collection("binxml") function
kv:collection-binxml($parent-key as xs:string?, $depth as xs:int?, $subrange as xs:string?) as document-node()* external;

declare %kv:collection("binxml") function
kv:collection-binxml($parent-key as xs:string?, $depth as xs:int?) as document-node()* external;

declare %kv:collection("binxml") function
kv:collection-binxml($parent-key as xs:string?) as document-node()* external;

パラメータ

「パラメータ」を参照してください。$subrangeを省略すると、$subrange()を指定したことと同じになります。同様に、$depthを省略すると、$depth()を指定したのと同じです。

戻り値

各値に対して1つのXMLドキュメント。

関連項目

『Oracle XML Developer's Kitプログラマーズ・ガイド』

5.4.2.5 kv:collection-tika

指定された値が呼び出されてドキュメント・ノードとして返されるときに、Tikaを使用してこの値を解析します。

シグネチャ

declare %kv:collection("tika") function
kv:collection-tika($parent-key as xs:string?, $depth as xs:int?, $subrange as xs:string?) $contentType as xs:string?) as document-node()* external;

パラメータ

「パラメータ」を参照してください。$subrangeを省略すると、$subrange()を指定したことと同じになります。同様に、$depthを省略すると、$depth()を指定したのと同じです。

戻り値

各値に対して1つのドキュメント・ノード。

5.4.2.6 kv:put-text

キーと値のペアを書き込みます。$valueはUTF-8としてエンコードされます。

シグネチャ

declare %kv:put("text") function
kv:put-text($key as xs:string, $value as xs:string) external;

5.4.2.7 kv:put-xml

キーと値のペアを書き込みます。$xmlはシリアライズされ、UTF-8としてエンコードされます。

シグネチャ

declare %kv:put("xml") function
kv:put-xml($key as xs:string, $xml as node()) external;

5.4.2.8 kv:put-binxml

キーと値のペアを書き込みます。$xmlはXDKバイナリXMLとしてエンコードされます。『Oracle XML Developer's Kitプログラマーズ・ガイド』を参照してください。

シグネチャ

declare %kv:putkv:put-binxml("binxml") function
($key as xs:string, $xml as node()) external;

5.4.2.9 kv:get-text

キーに関連付けられた値を取得します。値はUTF-8としてデコードされ、文字列として返されます。

シグネチャ

declare %kv:get("text") function
kv:get-text($key as xs:string) as xs:string? external;

5.4.2.10 kv:get-avroxml

キーに関連付けられた値を取得します。値はAvroレコードとして読み取られ、XML要素として返されます。レコードはXMLに変換されます(「レコードの読取り」を参照)。

シグネチャ

declare %kv:get("avroxml") function
kv:get-avroxml($key as xs:string) as element()? external;

5.4.2.11 kv:get-xml

キーに関連付けられた値を取得します。値は一連のバイトとして読み取られ、XMLとして解析されます。

シグネチャ

declare %kv:get("xml")  function
kv:get-xml($key as xs:string) as document-node()? external;

5.4.2.12 kv:get-binxml

キーに関連付けられた値を取得します。値はXDKバイナリXMLとして読み取られ、XMLドキュメントとして返されます。

シグネチャ

declare %kv:get("binxml") function
kv:get-binxml($key as xs:string) as document-node()? external;

関連項目

『Oracle XML Developer's Kitプログラマーズ・ガイド』

5.4.2.13 kv:get-tika

キーに関連付けられた値を取得します。値はバイト配列として解析され、ドキュメント・ノードとして返されます。

シグネチャ

declare %kv:get("tika") function
kv:get-tika($key as xs:string, $contentType as xs:string?) as document-node()? external;

関連項目

『Oracle XML Developer's Kitプログラマーズ・ガイド』

5.4.2.14 kv:key-range

接頭辞の範囲を定義します。接頭辞は、上限と下限(両端を含む)の両方を定義します。

この関数は、kv:collection関数のsubrange引数として使用します。

シグネチャ

kv:key-range($prefix as xs:string) as xs:string;

5.4.2.15 kv:key-range

キーの範囲を指定します。

この関数は、kv:collection関数のsubrange引数として使用します。

シグネチャ

kv:key-range($start as xs:string, $start-inclusive as xs:boolean, $end as xs:string, $end-inclusive as xs:boolean) as xs:string;

パラメータ

$start: キー範囲の下限を定義します。

$start-inclusive: 値がtrueの場合は範囲内に$startが含まれ、falseの場合は含まれません。

$end: キー範囲の上限を定義します。これは$startより大きい必要があります。

$end-inclusive: 値がtrueの場合は範囲内に$endが含まれ、falseの場合は含まれません。

5.4.3 表APIを使用してOracle NoSQL Databaseに対して読取りおよび書込みを実行する組込み関数

問合せで組込み関数を使用するには、次のように、ネームスペースが宣言され、モジュールがインポートされている必要があります。

declare namespace kv-table = "oxh:kv-table";
import module "oxh:kv-table";

表APIを使用したOracle NoSQL Databaseモジュールには、次の関数が含まれています。

- kv-table:collection-jsontext

- kv-table:get-jsontext

- kv-table:put-jsontext

5.4.3.1 kv-table:collection-jsontext

これらの関数は、NoSQL Databaseの単一表に格納されたすべての列または列のサブセットを反復します。それぞれの列は、JSON文字列形式で返されます。

シグネチャ

declare %kv-table:collection-jsontext("jsontext") function
kv-table:collection-jsontext($tableName as xs:string) as xs:string*

declare %kv-table:collection(“jsontext") function
kv-table:collection-jsontext($tableName as xs:string, $primaryKeyJsonValue as xs:string?) as xs:string*

declare %kv-table:collection(“jsontext") function
kv-table:collection-jsontext($tableName as xs:string, $primaryKeyJsonValue as xs:string?, $fieldRangeJsonValue as xs:string?) as xs:string*

パラメータ

$tableName as xs:string – NoSQL Database内の表の名前

$primaryKeyJsonValue as xs:string? – JSONテキストとして指定された部分主キー

関連項目:

http://docs.oracle.com/cd/NOSQL/html/GettingStartedGuideTables/primaryshardkeys.html#partialprimarykeys

$fieldRangeJsonValue as xs:string? – JSONテキストとして指定された主キーの残りのフィールドのフィールド幅

{
"name": “fieldname",
"start": “startVal",
"startInclusive": true|false,
"end" : "endVal",
"endInclusive": true|false
}

戻り値

それぞれの列のJSON値

json:parse-as-xml関数を使用して、JSON文字列をXMLドキュメントに解析します

5.4.3.2 kv-table:get-jsontext

この関数は、NoSQL Database内の表に格納された単一列を読み込みます。列は、JSON文字列形式で返されます。列が見つからない場合は、空の順序が返されます。

シグネチャ

declare %kv-table:get(“jsontext") function
kv-table:get-jsontext($tableName as xs:string, $primaryKeyJsonValue as xs:string) as xs:string?

パラメータ

$tableName as xs:string – NoSQL Database内の表の名前

$primaryKeyJsonValue as xs:string? – JSONテキストとして指定された完全主キー

関連項目:

http://docs.oracle.com/cd/NOSQL/html/GettingStartedGuideTables/primaryshardkeys.html#primarykeys

戻り値

列が見つからない場合、列のJSON値または空の順序。

json:parse-as-xml関数を使用して、JSON文字列をXMLドキュメントに解析します

5.4.3.3 kv-table:put-jsontext

この関数は、表APIを使用して、列をNoSQL Databaseに書き込みます。

シグネチャ

declare %kv-table:put(“jsontext") function
kv-table:put-jsontext($tableName as xs:string, $jsonValue as xs:string);

パラメータ

$tableName as xs:string – NoSQL Database内の表の名前

$jsonValue as xs:string – JSONテキストとして指定された列

5.4.4 ラージ・オブジェクトAPIを使用してOracle NoSQL Databaseに対して読取りおよび書込みを実行する組込み関数

問合せで組み込み関数を使用するには、次のように、ネームスペースが宣言され、モジュールがインポートされている必要があります。

declare namespace kv-lob = "oxh:kv-lob";
import module "oxh:kv-lob";

ラージ・オブジェクトAPIを使用したOracle NoSQL Databaseモジュールには、次の関数が含まれています。

- kv-lob:get-text

- kv-lob:get-xml

- kv-lob:get-binxml

- kv-lob:get-tika

- kv-lob:put-text

- kv-lob:put-xml

- kv-lob:put-binxml

5.4.4.1 kv-lob:get-text

キーに関連付けられた値を取得します。値はUTF-8としてデコードされ、文字列として返されます。

シグネチャ

declare %kv-lob:get("text")
function kv-lob:get-text($key as xs:string) as xs:string?

5.4.4.2 kv-lob:get-xml

キーに関連付けられた値を取得します。値は一連のバイトとして読み取られ、XMLとして解析されます。

シグネチャ

declare %kv-lob:get("xml")
function kv-lob:get-xml($key as xs:string) as document-node()?

5.4.4.3 kv-lob:get-binxml

キーに関連付けられた値を取得します。値はXDKバイナリXMLとして読み取られ、XMLドキュメントとして返されます。『Oracle XML Developer's Kitプログラマーズ・ガイド』を参照してください。

シグネチャ

declare %kv-lob:get("binxml")
function kv-lob:get-binxml($key as xs:string) as document-node()?

5.4.4.4 kv-lob:get-tika

キーに関連付けられた値を取得します。値はバイト配列として解析され、ドキュメント・ノードとして返されます。

シグネチャ

declare %kv-lob:get("tika")
function kv-lob:get-tika($key as xs:string) as document-node()?

declare %kv-lob:get("tika")
function kv-lob:get-tika($key as xs:string, $contentType as xs:string?) as document-node()?

5.4.4.5 kv-lob:put-text

キーと値のペアを書き込みます。$valueはUTF-8としてエンコードされます。

シグネチャ

declare %kv-lob:put("text")
function kv-lob:put-text($key as xs:string, $value as xs:string)

5.4.4.6 kv-lob:put-xml

キーと値のペアを書き込みます。$xmlはシリアライズされ、UTF-8としてエンコードされます。

シグネチャ

declare %kv-lob:put("xml")
function kv-lob:put-xml($key as xs:string, $document as node())

5.4.4.7 kv-lob:put-binxml

キーと値のペアを書き込みます。$xmlはXDKバイナリXMLとしてエンコードされます。『Oracle XML Developer's Kitプログラマーズ・ガイド』を参照してください。

シグネチャ

declare %kv-lob:put("binxml")
function kv-lob:put-binxml($key as xs:string, $document as node()

5.4.5 Oracle NoSQL Databaseから値を読み取るカスタム関数

次の関数を使用して、Oracle NoSQL Databaseから値を読み取ることができます。これらの注釈によって、組込み関数では使用できない追加機能を使用できます。

シグネチャ

NoSQL値のコレクションを読み取るカスタム関数には、次のいずれかのシグネチャが必要です。

declare %kv:collection("text") [additional annotations]
function local:myFunctionName($parent-key as xs:string?, $depth as xs:int?, $subrange as xs:string?) as xs:string* external;

declare %kv:collection(["xml"|"binxml"|"tika"]) [additional annotations]
function local:myFunctionName($parent-key as xs:string?, $depth as xs:int?, $subrange as xs:string?) as document-node()* external;

declare %kv:collection("tika") [additional annotations]
function local:myFunctionName($parent-key as xs:string?, $depth as xs:int?, $subrange as xs:string?, $contentType as xs:string?) as document-node()* external;

注釈

%kv:collection("method")

NoSQL Databaseのcollection関数を宣言します。必須。

methodパラメータは次のいずれかの値です。

- avroxml: 各値はAvroレコードとして読み取られ、XML要素として返されます。レコードはXMLに変換されます(「レコードの読取り」を参照)。

- binxml: 各値はXDKバイナリXMLとして読み取られ、XMLドキュメントとして返されます。

- text: 各値は、%output:encoding注釈で指定された文字セットを使用してデコードされます。

- tika: 各値はTikaにより解析され、ドキュメント・ノードとして返されます。

- xml: 各値はXMLとして解析され、XMLドキュメントとして返されます。

%kv:key("true" | "false")

キーと値のペアのキーが、戻り値のdocument-uriとして設定されるかどうかを制御します。キーを返すにはtrueに指定します。

デフォルト設定は、methodがxml、avroxmlまたはbinxmlの場合はtrue、textの場合はfalseです。この注釈がtrueに設定されたテキスト関数は、xs:string?ではなくtext()?を返すように宣言する必要があります。アトミックのxs:string値はdocumentノードには関連付けられませんが、textノードには関連付けられます。次に例を示します。

declare %kv:collection("text") %kv:key("true")
function local:col($parent-key as xs:string?) as text()* external;

キーが返されると、kv:key()関数を使用してその文字列表現を取得できます。次に例を示します。

for $value in local:col(...)
let $key := $value/kv:key()
return ...

%avro:schema-kv("schema-name")

Avroリーダー・スキーマを指定します。この注釈は、methodがavroxmlの場合のみ有効です。オプション。

schema-nameは完全修飾されたレコード名です。レコード・スキーマは、Oracle NoSQL Databaseカタログから取得されます。レコード値はリーダー・スキーマにマップされます。例, %avro:schema-kv("org.example.PersonRecord")

関連項目:

Avroスキーマについては、次のサイトにある『Oracle NoSQL Databaseスタート・ガイド』

http://docs.oracle.com/cd/NOSQL/html/GettingStartedGuide/schemaevolution.html

%output:encoding

テキスト値の文字エンコードを指定します。この注釈を使用しないと、UTF-8とみなされます。有効なエンコードは、JVMでサポートされているエンコードです。

現在、この注釈はテキスト・メソッドにのみ適用されます。XMLファイルの場合は、ドキュメントのエンコード宣言が使用されます(使用可能な場合)。

関連項目:

次のサイトにあるOracle Java SEドキュメントのサポートされているエンコードに関する項

http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html

パラメータ

パラメータ1: $parent-key as xs:string?

関数によって子のキーと値のペアが返される親キーを指定します。メジャー・キー・パスを部分パスとし、マイナー・キー・パスを空にする必要があります。空の順序によって、ストア内のすべてのキーがフェッチされます。

関連項目:

キーの書式については、次のサイトにあるOracle NoSQL Database Javaリファレンス

http://docs.oracle.com/cd/NOSQL/html/javadoc/oracle/kv/Key.html#toString

パラメータ2: $depth as xs:int?

親、子、子孫またはその組合せを返すかどうかを指定します。次の値が有効です。

- kv:depth-parent-and-descendants(): 親とすべての子孫を選択します。

- kv:depth-children-only(): 直下の子のみ選択しますが、親は選択しません。

- kv:depth-descendants-only(): すべての子孫を選択しますが、親は選択しません。

- kv:depth-parent-and-children(): 親と直下の子を選択します。

空の順序は、kv:depth-parent-and-descendants()を暗黙的に示します。

次の例は、すべての子孫を選択しますが、親は選択しません。

kv:collection-text("/parent/key", kv:depth-descendants-only(), ...

パラメータ3: $subRange as xs:string?

parentKey下の範囲をメジャー・パス・コンポーネントに制限するための部分範囲を指定します。文字列の書式は次のとおりです。

<startType>/<start>/<end>/<endType>

startTypeおよびendTypeは、I (含む場合)またはE (含まない場合)のいずれかです。

startおよびendは、開始および終了のキー文字列です。

範囲に下限がない場合は、先頭のstartType/start指定を文字列表現から省略します。同様に、範囲に上限がない場合は、末尾のend/endType指定を省略します。KeyRangeには少なくとも1つの境界が必要であるため、文字列表現に少なくとも1つの指定が必要です。

kv:key-range関数を使用すると、範囲文字列を簡単に作成できます。

値に空の順序を指定することもできます。

次の例は、有効な部分範囲の指定です。

例

説明

I/alpha/beta/E

alpha (この値を含む)からbeta (この値を含まない)

E//0123/I

"" (この値を含まない)から0123 (この値を含む)

I/chi/

chi (この値を含む)から無限大

E//

"" (この値を含まない)から無限大

/chi/E

負の無限大からchi (この値を含まない)

//I

負の無限大から"" (この値を含む)

5.4.6 Oracle NoSQL Databaseから単一値を取得するためのカスタム関数

Oracle NoSQL Databaseアダプタにはget関数があり、この関数を使用して単一値をデータベースから取得できます。collection関数とは異なり、get関数の呼出しはクラスタに分散されません。get関数が呼び出されると、単一のタスクによって値が取得されます。

シグネチャ

カスタムのget関数には、次のいずれかのシグネチャが必要です。

declare %kv:get("text") [additional annotations]
function local:myFunctionName($key as xs:string) as xs:string? external;

declare %kv:get("avroxml") [additional annotations]
function local:myFunctionName($key as xs:string) as element()? external;

declare %kv:get(["xml"|"binxml"|"tika"]) [additional annotations]
function local:myFunctionName($key as xs:string) as document-node()?

declare %kv:get(["tika"]) [additional annotations]
function local:myFunctionName($key as xs:string $contentType as xs:string?) as document-node()?

注釈

%kv:get("method")

NoSQL Databaseのget関数を宣言します。必須。

methodパラメータは次のいずれかの値です。

- avroxml: 値はAvroレコードとして読み取られ、XML要素として返されます。レコードはXMLに変換されます(「レコードの読取り」を参照)。

- binxml: 値はXDKバイナリXMLとして読み取られ、XMLドキュメントとして返されます。

- text: 値は、%output:encoding注釈で指定された文字セットを使用してデコードされます。

- tika: 各値はTikaにより解析され、ドキュメント・ノードとして返されます。

- xml: 値はXMLとして解析され、XMLドキュメントとして返されます。

%kv:key("true" | "false")

キーと値のペアのキーが、戻り値のdocument-uriとして設定されるかどうかを制御します。キーを返すにはtrueに指定します。

デフォルト設定は、methodがxml、avroxmlまたはbinxmlの場合はtrue、textの場合はfalseです。この注釈がtrueに設定されたテキスト関数は、xs:string?ではなくtext()?を返すように宣言する必要があります。アトミックのxs:string値はdocumentノードには関連付けられませんが、textノードには関連付けられます。

キーが返されると、kv:key()関数を使用してその文字列表現を取得できます。

%avro:schema-kv("schema-name")

Avroリーダー・スキーマを指定します。この注釈は、methodがavroxmlの場合のみ有効です。オプション。

schema-nameは完全修飾されたレコード名です。レコード・スキーマは、Oracle NoSQL Databaseカタログから取得されます。レコード値はリーダー・スキーマにマップされます。例, %avro:schema-kv("org.example.PersonRecord")

関連項目:

Avroスキーマについては、次のサイトにある『Oracle NoSQL Databaseスタート・ガイド』

http://docs.oracle.com/cd/NOSQL/html/GettingStartedGuide/schemaevolution.html

%output:encoding

テキスト値の文字エンコードを指定します。この注釈を使用しないと、UTF-8とみなされます。有効なエンコードは、JVMでサポートされているエンコードです。

現在、この注釈はテキスト・メソッドにのみ適用されます。XMLファイルの場合は、ドキュメントのエンコード宣言が使用されます(使用可能な場合)。

関連項目:

次のサイトにあるOracle Java SEドキュメントのサポートされているエンコードに関する項

http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html

5.4.7 表APIを使用してOracle NoSQL Databaseから値を読み取るカスタム関数

次の関数を使用して、表APIでOracle NoSQL Databaseから値を読み取ることができます。これらの注釈によって、組込み関数では使用できない追加機能を使用できます。

シグネチャ

表APIを使用してNoSQL値のコレクションを読み取るカスタム関数には、次のいずれかのシグネチャが必要です。

declare %kv-table:collection(“jsontext")
function local:myFunctionName($tableName as xs:string) as xs:string* external;

declare %kv-table:collection(“jsontext")
function local:myFunctionName($tableName as xs:string, $primaryKeyJsonValue as xs:string?) as xs:string* external;

declare %kv-table:collection(“jsontext")
function local:myFunctionName($tableName as xs:string, $primaryKeyJsonValue as xs:string?, $fieldRangeJsonValue as xs:string?) as xs:string* external;

注釈

%kv-table:collection(“jsontext")

表APIを使用するcollection関数を宣言します。

注意:

サポートされている必須の注釈値は、jsontextのみです。

パラメータ

「パラメータ」と同様です。

戻り値

「戻り値」と同様です。

5.4.8 表APIを使用してOracle NoSQL Databaseから単一列を読み取るカスタム関数

次の関数を使用して、表APIでOracle NoSQL Databaseから単一列を読み取ることができます。これらの注釈によって、組込み関数では使用できない追加機能を使用できます。

シグネチャ

表APIを使用してNoSQL Databaseのシグネチャ列を読み取るカスタム関数には、次のいずれかのシグネチャが必要です。

declare %kv-table:get(“jsontext")
function local:myFunctionName($tableName as xs:string, $primaryKeyJsonValue as xs:string?) as xs:string? external;

注釈

%kv-table:get(“jsontext")

表APIを使用するget関数を宣言します。

注意:

サポートされている必須の注釈値は、jsontextのみです。

パラメータ

「パラメータ」と同様です。

戻り値

「戻り値」と同様です。

5.4.9 ラージ・オブジェクトAPIを使用してOracle NoSQL Databaseから単一値を取得するためのカスタム関数

次の関数を使用して、ラージ・オブジェクトAPIでOracle NoSQL Databaseから値を読み取ることができます。これらの注釈によって、組込み関数では使用できない追加機能を使用できます。

シグネチャ

ラージ・オブジェクトAPIを使用して単一値を読み取るカスタム関数には、次のいずれかのシグネチャが必要です。

declare %kv-lob:get("text") [additional annotations]
function local:myFunctionName($key as xs:string) as xs:string? external;

declare %kv-lob:get(["xml"|"binxml"|"tika"]) [additional annotations]
function local:myFunctionName($key as xs:string) as document-node()?

declare %kv-lob:get(["tika"]) [additional annotations]
function local:myFunctionName($key as xs:string $contentType as xs:string?) as document-node()?

注釈

%kv-lob:get(“method")

ラージ・オブジェクトAPIを使用するNoSQL Databaseのget関数を宣言します。必須。サポートされているメソッド・パラメータは、binxml、text、tikaおよびxmlです(%kv:get("method")と同様です)。

注意:

avroxmlメソッドは、ラージ・オブジェクトAPIではサポートされていません。

%kv-lob:key("true" | "false")

キーと値のペアのキーが、ドキュメントURIの戻り値として設定されるかどうかを制御します。キーを返すにはtrueに指定します。%kv:key()と同様です。

%output:encoding

テキスト値の文字エンコードを指定します。この注釈を使用しないと、UTF-8とみなされます。有効なエンコードは、JVMでサポートされているエンコードです。現在、この注釈はテキスト・メソッドにのみ適用されます。XMLファイルの場合は、ドキュメントのエンコード宣言が使用されます(使用可能な場合)。

5.4.10 Oracle NoSQL Databaseに書き込むカスタム関数

次の注釈を使用して、Oracle NoSQL Databaseに書き込む関数を定義できます。

シグネチャ

Oracle NoSQL Databaseに書き込むカスタム関数には、次のいずれかのシグネチャが必要です。

declare %kv:put("text") function
local:myFunctionName($key as xs:string, $value as xs:string) external;

declare %kv:put(["xml"|"binxml"|"avroxml"]) function
local:myFunctionName($key as xs:string, $xml as node()) external;

注釈

注釈

説明

%kv:put("method")

NoSQL Databaseモジュールのput関数を宣言します。必須。

methodは値の格納方法を決定します。次のいずれかの値です。

- text: $valueは、%output:encoding注釈で指定された文字セットを使用してシリアライズおよびエンコードされます。

- avroxml: $xmlは、%avro:schema-kv注釈で指定されたAvroレコードのインスタンスにマップされます。「AvroとしてのXMLの書込み」を参照してください。

- binxml: $xmlはXDKバイナリXMLとしてエンコードされます。

- xml: $xmlは、%output:encoding注釈で指定された文字セットを使用してシリアライズおよびエンコードされます。%output:*を使用すると、他のXMLシリアライズ・パラメータを指定できます。

%avro:schema-kv("schema-name")

書き込まれる値のレコード・スキーマを指定します。注釈値は完全修飾されたレコード名です。レコード・スキーマは、Oracle NoSQL Databaseカタログから取得されます。

例: %avro:schema-kv("org.example.PersonRecord")

%output:*

%kv:putで指定される出力方法(テキストまたはXML)に対する標準XQueryシリアライズ・パラメータ。「シリアライズ注釈」を参照してください。

関連項目:

XMLおよびテキスト出力方法については、次のサイトにある『XSLT and XQuery Serialization 3.0』のシリアライズ・パラメータの影響に関する項

http://www.w3.org/TR/xslt-xquery-serialization-30/

5.4.11 表APIを使用してOracle NoSQL Databaseに値を書き込むカスタム関数

次の注釈を使用して、表APIを使用するOracle NoSQL Databaseに書き込む関数を定義できます。

シグネチャ

表APIを使用して列を書き込むカスタム関数には、次のいずれかのシグネチャが必要です。

declare %kv-table:put(“jsontext")
function local:myFunctionName($tableName as xs:string, $jsonValue as xs:string?) external;

注釈

%kv-table:put(“jsontext")

表APIを使用するput関数を宣言します。

注意:

サポートされている必須の注釈値は、jsontextのみです。

パラメータ

「パラメータ」と同様です。

5.4.12 ラージ・オブジェクトAPIを使用してOracle NoSQL Databaseに値を書き込むカスタム関数

次の注釈を使用して、ラージ・オブジェクトAPIを使用するOracle NoSQL Databaseに書き込む関数を定義できます。

シグネチャ

ラージ・オブジェクトAPIを使用して値を書き込むカスタム関数には、次のいずれかのシグネチャが必要です。

declare %kv-lob:put("text")
function  local:myFunctionName($key as xs:string, $value as xs:string) external;

declare %kv-lob:put(["xml"|"binxml"])
function local:myFunctionName($key as xs:string, $xml as node()) external;

注釈

%kv-lob:put("method")

NoSQL Databaseのput関数を宣言します。必須。サポートされているメソッド・パラメータは、binxml、textおよびxmlです("%kv:put("method")"と同様です)

注意:

avroxmlメソッドは、ラージ・オブジェクトAPIではサポートされていません。

%output:*

%kv-lob:putで指定される出力方法(テキストまたはXML)に対する標準XQueryシリアライズ・パラメータ。「シリアライズ注釈」を参照してください。

5.4.13 Oracle NoSQL Databaseアダプタの関数の例

例5-8 Oracle NoSQL Databaseに対するテキストの書込みと読取り

この例では、HDFS内の次のテキスト・ファイルを使用します。このファイルには、ユーザーID、姓名、年齢などのユーザー・プロファイル情報がコロン(:)区切りで格納されています。

mydata/users.txt

john:John Doe:45
kelly:Kelly Johnson:32
laura:Laura Smith:
phil:Phil Johnson:27

最初の問合せは、このテキスト・ファイルの行をテキスト値としてOracle NoSQL Databaseに格納します。

import module "oxh:text";
import module "oxh:kv";

for $line in text:collection("mydata/users.txt")
let $split := fn:tokenize($line, ":")
let $key := "/users/text/" || $split[1]
return
kv:put-text($key, $line)

次の問合せは、データベースから値を読み取ります。

import module "oxh:text";
import module "oxh:kv";

for $value in kv:collection-text("/users/text")
let $split := fn:tokenize($value, ":")
where $split[2] eq "Phil Johnson"
return
text:put($value)

この問合せは、次の行を含むテキスト・ファイルを作成します。

phil:Phil Johnson:27

例5-9 Oracle NoSQL Databaseに対するAvroの書込みと読取り

この例では、次のAvroスキーマがOracle NoSQL Databaseに登録されます。

{
"type": "record",
"name": "User",
"namespace": "com.example",
"fields" : [
{"name": "id", "type": "string"},
{"name": "full_name", "type": "string"},
{"name": "age", "type": ["int", "null"] }
]
}

次の問合せは、ユーザー名をAvroレコードとしてデータベースに書き込みます。

import module "oxh:text";

declare %kv:put("avroxml") %avro:schema-kv("com.example.User")
function local:put-user($key as xs:string, $value as node()) external;

for $line in text:collection("mydata/users.txt")
let $split := fn:tokenize($line, ":")
let $id := $split[1]
let $key := "/users/avro/" || $id
return
local:put-user(
$key,
<user>
<id>{$id}</id>
<full_name>{$split[2]}</full_name>
{
if ($split[3] castable as xs:int) then
<age>{$split[3]}</age>
else
()
}
</user>
)

この問合せは、データベースから値を読み取ります。

import module "oxh:text";
import module "oxh:kv";

for $user in kv:collection-avroxml("/users/avro")
where $user/age gt 30
return
text:put($user/full_name)

この問合せは、次の行を含むテキスト・ファイルを作成します。

John Doe
Kelly Johnson

例5-10 NoSQL DatabaseへのXMLの格納

次の問合せは、「XMLファイル・アダプタの関数の例」の例5-24に示されているXMLファイルを入力として使用します。Oracle NoSQL Databaseの値として、各コメント要素を書き込みます。

import module "oxh:xmlf";
import module "oxh:kv";

for $comment in xmlf:collection("mydata/comments*.xml")/comments/comment
let $key := "/comments/" || $comment/@id
return
kv:put-xml($key, $comment)

問合せは5つのcomment要素をXML値としてOracle NoSQL Databaseに書き込みます。

非常に大きなXMLファイルの場合、問合せを次のように修正することでパフォーマンスを向上し、ディスク・スペースの消費を削減します。

- 次のfor句を使用します。これにより、各XMLファイルが分割されて複数のタスクで並行して実行されるようになります。

for $comment in xmlf:collection("mydata/comments*.xml", "comment")

- return句ではkv:put-xmlではなく、kv:put-binxmlを使用して、プレーン・テキストではなくバイナリXMLで値を格納します。

kv:collection-xml関数を使用してデータベースの値を読み込みます。次に例を示します。

import module "oxh:text";
import module "oxh:kv";

for $comment in kv:collection-xml("/comments")/comment
return
text:put($comment/@id || " " || $comment/@user)

この問合せは、次の行を含むテキスト・ファイルを作成します。

12345 john
23456 john
54321 mike
56789 kelly
87654 mike

例5-11 XMLをAvroとしてOracle NoSQL Databaseに格納

この例は、XML値をAvroに変換してから格納します。

次のAvroスキーマをOracle NoSQL Databaseに追加します。

{
"type": "record",
"name": "Comment",
"namespace": "com.example",
"fields" : [
{"name": "cid", "type": "string"},
{"name": "user", "type": "string"},
{"name": "content", "type": "string"},
{"name": "likes", "type" : { "type" : "array", "items" : "string" } }
]
}

次の問合せは、5つのcomment要素をAvro値としてOracle NoSQL Databaseに書き込みます。

import module "oxh:xmlf";
import module "oxh:kv";

declare %kv:put("avroxml") %avro:schema-kv("com.example.Comment")
function local:put-comment($key as xs:string, $value as node()) external;

for $comment in xmlf:collection("mydata/comments*.xml", "comment")
let $key := "/comments/" || $comment/@id
let $value :=
<comment>
<cid>{$comment/@id/data()}</cid>
<user>{$comment/@user/data()}</user>
<content>{$comment/@text/data()}</content>
<likes>{
for $like in $comment/like
return <oxh:item>{$like/@user/data()}</oxh:item>
}</likes>
</comment>
return
local:put-comment($key, $value)

kv:collection-avroxml関数を使用して、データベースの値を読み込みます。次に例を示します。

import module "oxh:text";
import module "oxh:kv";

for $comment in kv:collection-avroxml("/comments")
return
text:put($comment/cid || " " || $comment/user || " " || count($comment/likes/*))

この問合せは、次の行を含むテキスト・ファイルを作成します。

12345 john 0
23456 john 2
54321 mike 1
56789 kelly 2
87654 mike 0

例5-12 Oracle NoSQL Database表APIを使用するデータの読取りおよび書込み

この例では、HDFS内の次のテキスト・ファイルを使用します。このファイルには、ユーザーID、姓名、年齢などのユーザー・プロファイル情報がコロン(:)区切りで格納されています。

mydata/users.txt
john:John Doe:45
kelly:Kelly Johnson:32
laura:Laura Smith:
phil:Phil Johnson:27

次のようにして、usersという名前の表をNoSQL DBに作成します。

CREATE TABLE users (id STRING, name STRING, age INTEGER, PRIMARY KEY (id));

最初の問合せは、この表にユーザーの年齢を格納します。

import module "oxh:text";
import module "oxh:kv-table";

for $line in text:collection("mydata/users.txt")
let $split := tokenize($line, ":")
let $id := $split[1]
let $name := $split[2]
let $age := $split[3]
where string-length($age) gt 0
let $row :=
'{' ||
'"id":"' || $id || '",' ||
'"name":"' || $name || '",' ||
'"age":' || $age ||
'}'

return
kv-table:put-jsontext(“users", $row)

この問合せを実行すると、表には次のレコードが含まれます。

id

name

age

john

John Doe

45

kelly

Kelly Johnson

32

phil

Phil Johnson

27

2番目の問合せは、表から列を読み取り、名前がJohnsonで終わるユーザーのIDを返します。

import module "oxh:text ";
import module "oxh:json";
import module "oxh:kv-table";

for $row in kv-table:collection("users")
let $user := json:parse-as-xml($row)
let $id := $user/json:get(“id")
let $name := $user/json:get(“name")
where ends-with($name, “Johnson")

return text:put($id)

この問合せは、次の行を含むテキスト・ファイルを作成します。

kelly
phil

例5-13 Oracle NoSQL Databaseラージ・オブジェクトAPIを使用するデータの読取り

Oracle NoSQL Databaseに次の情報が含まれているとします。

1. 表userImages
CREATE TABLE userImages (imageFileName STRING、imageVersion STRING、imageDescription INTEGER、PRIMARY KEY (imageFileName))

imageFileName

imageVersion

imageDescription

IMG_001.JPG

1

Sunrise

IMG_002.JPG

1

Sunrise

2. ラージ・オブジェクトAPIでロードされるKey/Valueデータは次のとおりです。

- Keyは、lob/imageFileName/image.lobです

- Valueは、JPEGイメージでEXIF形式の位置情報のメタデータを含みます

次の問合せは、メタデータを抽出して、imageFileName、緯度および経度としてCSV形式に変換します。

import module “oxh:kv-table";
import module “oxh:kv-lob";
import module "oxh:tika";
import module "oxh:json";
import module "oxh:text ";

for $row in kv-table:collection("userImages")

let $imageFileName := json:parse-as-xml($row)/json:get(“imageFileName")
let $imageKey := “lob/" || $imageFileName || “/image.lob"
let $doc := kv-lob:get-tika($imageKey, “image/jpeg")
let $lat := $doc/tika:metadata/tika:property[@name eq "GPS Latitude"]
let $lon := $doc/tika:metadata/tika:property[@name eq "GPS Longitude"]
where exists($lat) and exists($lon)

return text:put($imageFileName || "," || $lat || "," || $lon)

5.4.14 Oracle NoSQL Databaseアダプタの構成プロパティ

Oracle XQuery for Hadoopでは、構成プロパティを指定する汎用オプションをHadoopコマンドで使用します。構成ファイルを指定する場合は-confオプションを使用し、個別のプロパティを指定する場合は-Dオプションを使用します。「問合せの実行」を参照してください。

Oracle NoSQL Databaseアダプタには、永続性およびタイムアウト期間を制御する各種の構成プロパティを設定できます。oracle.kv.hostsおよびoracle.kv.kvstoreを設定する必要があります。次のプロパティでOracle NoSQL Databaseアダプタを構成します。

プロパティ

説明

oracle.hadoop.xquery.kv.config.durability

型: String

デフォルト値: NO_SYNC、NO_SYNC、SIMPLE_MAJORITY

説明: %kv:put操作に関連付けられた永続性を定義します。値は3つの部分で構成され、順番に指定してカンマ(,)で区切ります。

MasterPolicy, ReplicaPolicy, ReplicaAck

- MasterPolicy: トランザクションをマスター・データベースにコミットするときに使用される同期化ポリシー。この部分は次のいずれかの定数に設定します。
NO_SYNC: トランザクションのコミット時に、ログを書き込んだり同期的にフラッシュしません。

SYNC: トランザクションのコミット時に、ログを書き込み同期的にフラッシュします。

WRITE_NO_SYNC: トランザクションのコミット時に、ログを書き込みますが、同期的にフラッシュしません。

- ReplicaPolicy: トランザクションをレプリカ・データベースにコミットするときに使用される同期化ポリシー。この部分はNO_SYNC、SYNCまたはWRITE_NO_SYNCに設定します(MasterPolicyの説明を参照)。

- ReplicaAck: レプリカ・データベースからトランザクション受信確認を取得するのに使用される通知ポリシー。この部分は次のいずれかの定数に設定します。
ALL: すべてのレプリカは、トランザクションをコミットしたことを受信確認する必要があります。

NONE: トランザクションのコミットの受信確認は不要で、マスターは通知を待機しません。

SIMPLE_MAJORITY: レプリカの過半数(例: 5つの内の3つ)が、トランザクションをコミットしたことを受信確認する必要があります。

関連項目:

次のサイトにある『Oracle NoSQL Databaseスタート・ガイド』の永続性保証に関する項

http://docs.oracle.com/cd/NOSQL/html/GettingStartedGuide/durability.html

oracle.hadoop.xquery.kv.config.requestLimit

型: 整数のカンマ区切りのリスト

デフォルト値: 100, 90, 80

説明: 同時要求の数を制限して、サービス時間が長い複数のノードがKVストア・クライアントのすべてのスレッドを消費するのを防ぎます。値は3つの整数で構成され、順番に指定してカンマで区切ります。

maxActiveRequests, requestThresholdPercent, nodeLimitPercent

- maxActiveRequests: KVクライアントで許可されるアクティブな要求の最大数。通常、この数は、クライアントが要求を処理するために確保したスレッドの最大数から導出されます。

- requestThresholdPercent: 要求が制限されるmaxActiveRequestsのパーセンテージ。

- nodeLimitPercent: アクティブな要求の数がrequestThresholdPercentで指定したしきい値を超えた場合に、ノードに関連付けることができるアクティブな要求の最大数。

oracle.hadoop.xquery.kv.config.requestTimeout

型: Long

デフォルト値: 5000ミリ秒

説明: 要求のタイムアウト期間をミリ秒で構成します。値はゼロ(0)より大きい必要があります。

oracle.hadoop.xquery.kv.config.socketOpenTimeout

型: Long

デフォルト値: 5000ミリ秒

説明: クライアント要求のソケットを確立するときに使用されるオープン・タイムアウトをミリ秒で構成します。タイムアウトが短いほど、より迅速に障害を検出してリカバリできます。ほとんどのアプリケーションは、デフォルトのオープン・タイムアウトが適切です。値はゼロ(0)より大きい必要があります。

oracle.hadoop.xquery.kv.config.socketReadTimeout

型: Long

デフォルト値: 30000ミリ秒

説明: クライアント要求を行うソケットに関連付けられる読取りタイムアウト期間をミリ秒で構成します。タイムアウトが短いほど、より迅速に障害を検出してリカバリできます。ただし、最長のタイムアウトが要求に関連付けられるように、タイムアウト期間は十分な長さにする必要があります。

oracle.kv.batchSize

型: Key

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

説明: 各ネットワーク・ラウンドトリップ中、InputFormatがフェッチに必要とするキー数。ゼロ(0)値は、プロパティをデフォルト値に設定します。

oracle.kv.consistency

型: Consistency

デフォルト値: NONE_REQUIRED

説明: 子のキーと値のペアを読み取る際の一貫性保証です。次のキーワードは有効な値です。

- ABSOLUTE: 一貫性が絶対的となるよう、マスターがトランザクションを提供する必要があります。

- NONE_REQUIRED: レプリカが、マスターと比較したレプリカの状態に関係なく、トランザクションを提供することが可能です。

oracle.kv.hosts

型: String

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

説明: ソース・データがあるKVストア内のホストを識別する、1つ以上のhostname:portペアの配列。複数のペアはカンマで区切ります。

oracle.kv.kvstore

型: String

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

説明: ソース・データがあるKVストアの名前。

oracle.kv.timeout

型: Long

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

説明: 選択したキーと値のペアを取得する場合の最大時間間隔(ミリ秒)を設定します。ゼロ(0)値は、プロパティをデフォルト値に設定します。

関連項目:

次のサイトにあるOracle NoSQL Database Java APIリファレンス

http://docs.oracle.com/cd/NOSQL/html/javadoc/oracle/kv/hadoop/KVInputFormatBase.html

oracle.hadoop.xquery.kv.config.LOBSuffix

型: String

デフォルト値: lob

説明: LOBキーに関連付けられたデフォルトの接尾辞を構成します。

関連項目:

次のサイトにあるOracle NoSQL Database Java APIリファレンス

http://docs.oracle.com/cd/NOSQL/html/javadoc/oracle/kv/KVStoreConfig.html#setLOBSuffix(java.lang.String)

oracle.hadoop.xquery.kv.config.LOBTimeout

型: Long

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

説明: LOBでの操作中のチャンク・アクセスに関連付けられるデフォルトのタイムアウト値を構成します。

関連項目:

次のサイトにあるOracle NoSQL Database Java APIリファレンス

http://docs.oracle.com/cd/NOSQL/html/javadoc/oracle/kv/KVStoreConfig.html#setLOBTimeout(long,%20java.util.concurrent.TimeUnit)

oracle.hadoop.xquery.kv.config.readZones

型: 文字列のカンマ区切りのリスト

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

説明: 読取り操作で使用するためにノードを配置するゾーンを設定します。

関連項目:

次のサイトにあるOracle NoSQL Database Java APIリファレンス

http://docs.oracle.com/cd/NOSQL/html/javadoc/oracle/kv/KVStoreConfig.html#setReadZones(java.lang.String)

oracle.hadoop.xquery.kv.config.security

型: String

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

説明: クライアントのセキュリティ・プロパティを構成します。

関連項目:

次のサイトにあるOracle NoSQL Database Java APIリファレンス

http://docs.oracle.com/cd/NOSQL/html/javadoc/oracle/kv/KVSecurityConstants.html

http://docs.oracle.com/cd/NOSQL/html/javadoc/oracle/kv/KVStoreConfig.html#setSecurityProperties(java.util.Properties)

5.5 順序ファイル・アダプタ

順序ファイル・アダプタは、Hadoop順序ファイルの読取りおよび書込みを実行する関数を提供します。順序ファイルは、キーと値のペアで構成されるHadoop固有のファイル形式です。

次のトピックでは、関数について説明します。

- 順序ファイルの読取りおよび書込みを実行する組込み関数

- 順序ファイルを読み取るカスタム関数

- 順序ファイルを書き込むカスタム関数

- 順序ファイル・アダプタの関数の例

関連項目:

Hadoop順序ファイルについては、次のサイトにあるHadoop Wiki

http://wiki.apache.org/hadoop/SequenceFile

5.5.1 順序ファイルの読取りおよび書込みを実行する組込み関数

問合せで組込み関数を使用するには、次のように順序ファイル・モジュールをインポートする必要があります。

import module "oxh:seq";

順序ファイル・モジュールには、次の関数が含まれています。

- seq:collection

- seq:collection-xml

- seq:collection-binxml

- seq:collection-tika

- seq:put

- seq:put-xml

- seq:put-binxml

例については、「順序ファイル・アダプタの関数の例」を参照してください。

5.5.1.1 seq:collection

HDFS内の順序ファイルのコレクションにアクセスし、値を文字列として返します。ファイルを分割して、複数のタスクで並列で処理できます。

シグネチャ

declare %seq:collection("text") function
seq:collection($uris as xs:string*) as xs:string* external;

パラメータ

$uris: 順序ファイルのURI。順序ファイル内の値は、org.apache.hadoop.io.Textまたはorg.apache.hadoop.io.BytesWritableのいずれかである必要があります。BytesWritable値の場合、バイトはUTF-8デコーダを使用して文字列に変換されます。

戻り値

各ファイルの各値に対して1つの文字列。

5.5.1.2 seq:collection-xml

HDFS内の順序ファイルのコレクションにアクセスし、各値をXMLとして解析して返します。各ファイルを分割して、複数のタスクで並列で処理できます。

シグネチャ

declare %seq:collection("xml") function
seq:collection-xml($uris as xs:string*) as document-node()* external;

パラメータ

$uris: 順序ファイルのURI。順序ファイル内の値は、org.apache.hadoop.io.Textまたはorg.apache.hadoop.io.BytesWritableのいずれかである必要があります。BytesWritable値の場合は、XMLドキュメントのエンコード宣言が使用されます(使用可能な場合)。

戻り値

各ファイルの各値に対して1つのXMLドキュメント。「Tikaパーサーの出力形式」を参照してください。

5.5.1.3 seq:collection-binxml

HDFS内の順序ファイルのコレクションにアクセスし、各値をバイナリXMLとして読み取って返します。各ファイルを分割して、複数のタスクで並列で処理できます。

シグネチャ

declare %seq:collection("binxml") function
seq:collection-binxml($uris as xs:string*) as document-node()* external;

パラメータ

$uris: 順序ファイルのURI。順序ファイル内の値は、org.apache.hadoop.io.BytesWritableである必要があります。バイトはバイナリXMLとしてデコードされます。

戻り値

各ファイルの各値に対して1つのXMLドキュメント。

注意

この関数を使用すると、前の問合せでseq:put-binxmlによって作成されたファイルを読み取ることができます。「seq:put-binxml」を参照してください。

関連項目

『Oracle XML Developer's Kitプログラマーズ・ガイド』

5.5.1.4 seq:collection-tika

Tikaを使用して、HDFS内の順序ファイルを解析します。順序ファイル内の値は、org.apache.hadoop.io.Textまたはorg.apache.hadoop.io.BytesWritableのいずれかである必要があります。各値に対して、Tikaにより生成されたドキュメント・ノードが返されます。

シグネチャ

declare %seq:collection("tika") function
seq:collection-tika($uris as xs:string*) as document-node()* external;
declare %seq:collection("tika") function
seq:collection-tika($uris as xs:string*, $contentType as xs:string?) as document-node()* external;

パラメータ

$uris: 順序ファイルのURI。順序ファイル内の値は、org.apache.hadoop.io.Textまたはorg.apache.hadoop.io.BytesWritableのいずれかである必要があります。Tikaライブラリによって自動的に文字エンコードが検出されます。または、エンコーディングを$contentTypeパラメータ内でcharset属性として渡すこともできます。

$contentType: 解析するコンテンツのメディア・タイプを指定するもので、charset属性を含めることができます。

戻り値

各ファイルの各値に対して1つのドキュメント・ノード。

5.5.1.5 seq:put

キーと値のペアの文字列値か、キーと文字列値の両方を、問合せの出力ディレクトリ内の順序ファイルに書き込みます。

この関数は、キーと値をorg.apache.hadoop.io.Textとして書き込みます。

関数が$keyパラメータなしで呼び出された場合は、キー値がないため、この関数は値をorg.apache.hadoop.io.Textとして書き込み、キー・クラスをorg.apache.hadoop.io.NullWritableに設定します。

シグネチャ

declare %seq:put("text") function
seq:put($key as xs:string, $value as xs:string) external;

declare %seq:put("text") function
seq:put($value as xs:string) external;

パラメータ

$key: キーと値のペアのキー

$value: キーと値のペアの値

戻り値

empty-sequence()

注意

値は1つ以上の順序ファイルに展開されます。作成されるファイル数は、問合せがどのように複数のタスクに分散されているかによって異なります。各ファイルの名前はpartで始まります(例: part-m-00000)。問合せの実行時に、出力ディレクトリを指定します。「問合せの実行」を参照してください。

5.5.1.6 seq:put-xml

XML値か、キーとXML値を、問合せの出力ディレクトリ内の順序ファイルに書き込みます。

この関数は、キーと値をorg.apache.hadoop.io.Textとして書き込みます。

関数が$keyパラメータなしで呼び出された場合は、キー値がないため、この関数は値をorg.apache.hadoop.io.Textとして書き込み、キー・クラスをorg.apache.hadoop.io.NullWritableに設定します。

シグネチャ

declare %seq:put("xml") function
seq:put-xml($key as xs:string, $xml as node()) external;

declare %seq:put("xml") function
seq:put-xml($xml as node()) external;

パラメータ

$key: キーと値のペアのキー

$value: キーと値のペアの値

戻り値

empty-sequence()

注意

値は1つ以上の順序ファイルに展開されます。作成されるファイル数は、問合せがどのように複数のタスクに分散されているかによって異なります。各ファイルの名前は「part」で始まります(例: part-m-00000)。問合せの実行時に、出力ディレクトリを指定します。「問合せの実行」を参照してください。

5.5.1.7 seq:put-binxml

XML値をバイナリXMLとしてエンコードし、エンコードされたバイトを問合せの出力ディレクトリ内の順序ファイルに書き込みます。値は1つ以上の順序ファイルに展開されます。

この関数は、キーをorg.apache.hadoop.io.Textとして書き込み、値をorg.apache.hadoop.io.BytesWritableとして書き込みます。

関数が$keyパラメータなしで呼び出された場合は、キー値がないため、この関数は値をorg.apache.hadoop.io.BytesWritableとして書き込み、キー・クラスをorg.apache.hadoop.io.NullWritableに設定します。

シグネチャ

declare %seq:put("binxml") function
seq:put-binxml($key as xs:string, $xml as node()) external;

declare %seq:put("binxml") function
seq:put-binxml($xml as node()) external;

パラメータ

$key: キーと値のペアのキー

$value: キーと値のペアの値

戻り値

empty-sequence()

注意

作成されるファイル数は、問合せがどのように複数のタスクに分散されているかによって異なります。各ファイルの名前はpartで始まります(例: part-m-00000)。問合せの実行時に、出力ディレクトリを指定します。「問合せの実行」を参照してください。

seq:collection-binxml関数を使用すると、この関数によって作成されたファイルを読み取ることができます。「seq:collection-binxml」を参照してください。

関連項目

『Oracle XML Developer's Kitプログラマーズ・ガイド』

5.5.2 順序ファイルを読み取るカスタム関数

次の注釈を使用して、順序ファイルのコレクションを読み取る関数を定義できます。これらの注釈によって、組込み関数では使用できない追加機能を使用できます。

シグネチャ

順序ファイルを読み取るカスタム関数には、次のいずれかのシグネチャが必要です。

declare %seq:collection("text") [additional annotations]
function local:myFunctionName($uris as xs:string*) as xs:string* external;

declare %seq:collection(["xml"|"binxml"|"tika"]) [additional annotations]
function local:myFunctionName($uris as xs:string*) as document-node()* external;
declare %seq:collection(["tika"]) [additional annotations]
function local:myFunctionName($uris as xs:string*, $contentType as xs:string?) as document-node()* external;

注釈

%seq:collection(["method"])

順序ファイルを読み取るための、順序ファイルのcollection関数を宣言します。必須。

オプションのmethodパラメータは次のいずれかの値です。

- text: 順序ファイル内の値は、org.apache.hadoop.io.Textまたはorg.apache.hadoop.io.BytesWritableのいずれかである必要があります。バイトは、%output:encoding注釈で指定された文字セットを使用してデコードされます。これらはxs:stringとして返されます。デフォルト。

- xml: 順序ファイル内の値は、org.apache.hadoop.io.Textまたはorg.apache.hadoop.io.BytesWritableのいずれかである必要があります。関数によって、値はXMLとして解析されて返されます。

- binxml: 順序ファイル内の値は、org.apache.hadoop.io.BytesWritableである必要があります。関数によって、値はXDKバイナリXMLとして読み取られて返されます。『Oracle XML Developer's Kitプログラマーズ・ガイド』を参照してください。

- tika: 順序ファイル内の値は、org.apache.hadoop.io.Textまたはorg.apache.hadoop.io.BytesWritableのいずれかである必要があります。値はTikaによって解析され、関数によって返されます。

%output:encoding("charset")

入力値の文字エンコードを指定します。有効なエンコードは、JVMでサポートされているエンコードです。UTF-8がデフォルトのエンコードです。

関連項目:

次のサイトにあるOracle Java SEドキュメントのサポートされているエンコードに関する項

http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html

%seq:key("true" | "false")

キーと値のペアのキーが、戻り値のdocument-uriとして設定されるかどうかを制御します。キーを返すにはtrueに指定します。デフォルト設定は、methodがbinxmlまたはxmlの場合はtrue、textの場合はfalseです。

アトミックのxs:stringがドキュメントに関連付けられていないため、この注釈がtrueに設定されたテキスト関数は、xs:string*ではなくtext()*を返す必要があります。

キーが返されると、seq:key関数を使用してその文字列表現を取得できます。

この例は、%seq:keyがtrueに設定されているため、文字列値ではなくテキストを返します。

declare %seq:collection("text") %seq:key("true")
function local:col($uris as xs:string*) as text()* external;

次の例は、seq:key関数を使用して、キーの文字列表現を取得します。

for $value in local:col(...)
let $key := $value/seq:key()
return
.
.
.

%seq:split-max("split-size")

最大分割サイズを整数または文字列値で指定します。分割サイズによって、入力ファイルがタスクに分割される方法を制御します。Hadoopは、分割サイズをmax($split-min, min($split-max, $block-size))で計算します。オプション。

文字列値の場合、バイト(デフォルトの単位)のかわりに、K、k、M、m、Gまたはgを値に追加してキロバイト、メガバイトまたはギガバイトを表すことができます。これらの修飾子は大文字と小文字を区別しません。次の例は同等です。

%seq:split-max(1024)
%seq:split-max("1024")
%seq:split-max("1K")

%seq:split-min("split-size")

最小分割サイズを整数または文字列値で指定します。分割サイズによって、入力ファイルがタスクに分割される方法を制御します。Hadoopは、分割サイズをmax($split-min, min($split-max, $block-size))で計算します。オプション。

文字列値の場合、バイト(デフォルトの単位)のかわりに、K、k、M、m、Gまたはgを値に追加してキロバイト、メガバイトまたはギガバイトを表すことができます。これらの修飾子は大文字と小文字を区別しません。次の例は同等です。

%seq:split-min(1024)
%seq:split-min("1024")
%seq:split-min("1K")

5.5.3 順序ファイルを書き込むカスタム関数

次の注釈を使用して、HDFS内の順序ファイルのコレクションを書き込む関数を定義できます。

シグネチャ

順序ファイルを書き込むカスタム関数には、次のいずれかのシグネチャが必要です。キー値を書き込まない場合は、$key引数を省略できます。

declare %seq:put("text") [additional annotations]
function local:myFunctionName($key as xs:string, $value as xs:string) external;

declare %seq:put(["xml"|"binxml"]) [additional annotations]
function local:myFunctionName($key as xs:string, $xml as node()) external;

注釈

%seq:put("method")

キーと値のペアを順序ファイルに書き込むための、順序ファイルのput関数を宣言します。必須。

シグネチャで$key引数を使用する場合、キーはorg.apache.hadoop.io.Textとして書き込まれます。$key引数を省略すると、キー・クラスはorg.apache.hadoop.io.NullWritableに設定されます。

methodパラメータをtext、xmlまたはbinxmlに設定します。methodは、値の書込みに使用されるタイプを決定します。

- text: org.apache.hadoop.io.Textとして書き込まれる文字列

- xml: org.apache.hadoop.io.Textとして書き込まれるXML

- binxml: XDKバイナリXMLとしてエンコードされ、org.apache.hadoop.io.BytesWritableとして書き込まれるXML

%seq:compress("codec", "compressionType")

出力で使用する圧縮形式を指定します。デフォルトは圧縮なしです。オプション。

codecパラメータは圧縮コーデックを識別します。値が一致して、最初に登録された圧縮コーデックが使用されます。値は、次のいずれかと等しい場合にコーデックに一致します。

1. コーデックの完全修飾されたクラス名

2. コーデックの修飾されていないクラス名

3. Codec (大文字と小文字を区別しない)の前にある、修飾されていないクラス名の接頭辞

compressionTypeパラメータを次のいずれかの値に設定します。

- block: キーと値がグループに収集され、まとめて圧縮されます。ブロック圧縮は、圧縮アルゴリズムで異なる値の類似性を利用できるため、通常はよりコンパクトになります。

- record: 順序ファイル内の値のみ圧縮されます。

次のすべての例では、デフォルトのコーデックおよびブロック圧縮を使用します。

%seq:compress("org.apache.hadoop.io.compress.DefaultCodec", "block")
%seq:compress("DefaultCodec", "block")
%seq:compress("default", "block")

%seq:file("name")

出力ファイル名の接頭辞を指定します。デフォルトの接頭辞はpartです。

%output:parameter

%seq:putで指定される出力方法(テキストまたはXML)に対する標準XQueryシリアライズ・パラメータ。「シリアライズ注釈」を参照してください。

関連項目:

次のサイトにあるHadoop Wikiの順序ファイルに関するトピック

http://wiki.apache.org/hadoop/SequenceFile

XMLおよびテキスト出力方法については、次のサイトにある『XSLT and XQuery Serialization 3.0』のシリアライズ・パラメータの影響に関する項

http://www.w3.org/TR/xslt-xquery-serialization-30/

5.5.4 順序ファイル・アダプタの関数の例

次の各例は、次の内容でHDFS内の3つのXMLファイルを問い合せます。各XMLファイルには、特定の日にユーザーが記入したコメントが含まれています。各コメントには、他のユーザーからのlikeが1個以上あるか、likeがない場合もあります。

mydata/comments1.xml

<comments date="2013-12-30">
<comment id="12345" user="john" text="It is raining :( "/>
<comment id="56789" user="kelly" text="I won the lottery!">
<like user="john"/>
<like user="mike"/>
</comment>
</comments>

mydata/comments2.xml

<comments date="2013-12-31">
<comment id="54321" user="mike" text="Happy New Year!">
<like user="laura"/>
</comment>
</comments>

mydata/comments3.xml

<comments date="2014-01-01">
<comment id="87654" user="mike" text="I don't feel so good."/>
<comment id="23456" user="john" text="What a beautiful day!">
<like user="kelly"/>
<like user="phil"/>
</comment>
</comments>

例5-14

次の問合せは、comment要素を順序ファイルに格納します。

import module "oxh:seq";
import module "oxh:xmlf";

for $comment in xmlf:collection("mydata/comments*.xml", "comment")
return
seq:put-xml($comment)

例5-15

次の問合せは、前の問合せによって生成され、myoutputという名前の出力ディレクトリに格納されている順序ファイルを読み取ります。次に、この問合せは、複数のコメントを記入したユーザーの名前をテキスト・ファイルに書き込みます。

import module "oxh:seq";
import module "oxh:text";

for $comment in seq:collection-xml("myoutput/part*")/comment
let $user := $comment/@user
group by $user
let $count := count($comment)
where $count gt 1
return
text:put($user || " " || $count)

前の問合せによって作成されたテキスト・ファイルには、次の行が含まれます。

john 2
mike 2

「XMLファイル・アダプタ」を参照してください。

例5-16

次の問合せは、XMLファイルからcomment要素を抽出して、圧縮された順序ファイルに格納します。各コメントを格納する前に、id属性を削除し、値を順序ファイルのキーとして使用します。

import module "oxh:xmlf";

declare
%seq:put("xml")
%seq:compress("default", "block")
%seq:file("comments")
function local:myPut($key as xs:string, $value as node()) external;

for $comment in xmlf:collection("mydata/comments*.xml", "comment")
let $id := $comment/@id
let $newComment :=
copy $c := $comment
modify delete node $c/@id
return $c
return
local:myPut($id, $newComment)

例5-17

次の問合せは、前の問合せによってmyoutputという名前の出力ディレクトリに作成された順序ファイルを読み取ります。問合せでは、順序ファイルが自動的に解凍されます。

import module "oxh:text";
import module "oxh:seq";

for $comment in seq:collection-xml("myoutput/comments*")/comment
let $id := $comment/seq:key()
where $id eq "12345"
return
text:put-xml($comment)

この問合せは、次の行を含むテキスト・ファイルを作成します。

<comment id="12345" user="john" text="It is raining :( "/>

5.6 Solrアダプタ

このアダプタはフルテキスト索引を作成してApache Solrサーバーにロードする関数を提供します。これらの関数は、Solrのorg.apache.solr.hadoop.MapReduceIndexerToolを実行時に呼び出してHDFS上にフルテキスト索引を生成し、オプションでSolrサーバーにマージします。このアダプタから供給された複数のカスタムput関数と組込みput関数を1つの問合せ内で宣言および使用できます。たとえば、別々のSolrコレクションまたは別々のSolrクラスタにデータをロードできます。

次のトピックでは、このアダプタについて説明します。

- Solrアダプタを使用するための前提条件

- データをSolrサーバーにロードするための組込み関数

- データをSolrサーバーにロードするためのカスタム関数

- Solrアダプタの関数の例

- Solrアダプタ構成プロパティ

5.6.1 Solrアダプタを使用するための前提条件

Solrアダプタを初めて使用するときには、「Oracle XQuery for Hadoopのインストール」に説明されているとおりにHadoopクラスタにSolrがインストールされ構成されていることを確認してください。

5.6.1.1 構成設定

Oracle XQuery for Hadoop問合せは次の構成プロパティまたは同等の注釈を使用する必要があります。

- oracle.hadoop.xquery.solr.loader.zk-host

- oracle.hadoop.xquery.solr.loader.collection

索引がSolrサーバーのライブ・セットにロードされている場合も、この構成プロパティまたは同等の注釈が必要です。

- oracle.hadoop.xquery.solr.loader.go-live

構成プロパティは、問合せの実行時にhadoopコマンドで-Dオプションまたは-confオプションを使用すると設定できます。「問合せの実行」および「Solrアダプタ構成プロパティ」を参照してください

5.6.1.2 Solrアダプタを使用した問合せの例

この例では、OXH_SOLR_MR_HOMEを設定し、問合せでhadoop -Dオプションを使用して構成プロパティを設定します。

$ export OXH_SOLR_MR_HOME=/usr/lib/solr/contrib/mr
$ hadoop jar $OXH_HOME/lib/oxh.jar -D oracle.hadoop.xquery.solr.loader.zk-host=/solr -D oracle.hadoop.xquery.solr.loader.collection=collection1 -D oracle.hadoop.xquery.solr.loader.go-live=true  ./myquery.xq -output ./myoutput

5.6.2 データをSolrサーバーにロードするための組込み関数

問合せで組込み関数を使用するには、次のようにSolrモジュールをインポートする必要があります。

import module "oxh:solr";

Solrモジュールには、次の関数が含まれています。

- solr:put

接頭辞solrは、デフォルトでoxh:solrネームスペースにバインドされます。

5.6.2.1 solr:put

Solr索引に単一のドキュメントを書き込みます。

このドキュメントXML形式は、次のサイトでSolrによって指定されます。

https://wiki.apache.org/solr/UpdateXmlMessages

シグネチャ

declare %solr:put function
solr:put($value as element(doc)) external;

パラメータ

$value: docと呼ばれる単一のXML要素。この要素には、ここで示すように1つ以上のfield要素が含まれます。

<doc>
<field name="field_name_1">field_value_1</field>
.
.
.
<field name="field_name_N">field_value_N</field>
</doc>

戻り値

output_dir/solr-putディレクトリに書き込まれた生成済索引。output_dirは問合せの出力ディレクトリです

5.6.3 データをSolrサーバーにロードするためのカスタム関数

次の注釈を使用して、フルテキスト索引を生成し、Solrにロードする関数を定義できます。

シグネチャ

Solr索引を生成するカスタム関数には、次のシグネチャが必要です。

declare %solr:put [additional annotations]
function local:myFunctionName($value as node()) external;

注釈

%solr:put

solr put関数を宣言します。必須。

%solr:file(directory_name)

索引ファイルが書き込まれる、問合せの出力ディレクトリの下にあるサブディレクトリの名前。オプションで、デフォルト値は関数のローカル名です。

%solr-property:property_name(value)

索引生成の様々な側面をコントロールします。複数の%solr-property注釈を指定できます。

これらの注釈はorg.apache.solr.hadoop.MapReduceIndexerToolのコマンドライン・オプションに対応します。各MapReduceIndexerTool?オプションには同等のOracle XQuery for Hadoop構成プロパティおよび%solr-property注釈があります。注釈は構成プロパティよりも優先されます。サポートされている構成プロパティおよび対応する注釈の詳細は、「Solrアダプタ構成プロパティ」を参照してください。

関連項目:

MapReduceIndexerTool?コマンドライン・オプションに関する詳細は、次のサイトのCloudera Searchユーザー・ガイドを参照してください。

http://www.cloudera.com/content/cloudera-content/cloudera-docs/Search/latest/Cloudera-Search-User-Guide/csug_mapreduceindexertool.html

パラメータ

$value: Solr XML構文と一致する要素またはドキュメント・ノード。詳細は、「solr:put」を参照してください。

5.6.4 Solrアダプタの関数の例

例5-18 組込みsolr:put関数の使用

この例では、次のHDFSテキスト・ファイルを使用します。このファイルには、ユーザーID、姓名、年齢などのユーザー・プロファイル情報がコロン(:)区切りで格納されています。

mydata/users.txt
john:John Doe:45
kelly:Kelly Johnson:32
laura:Laura Smith:
phil:Phil Johnson:27

最初の問合せは、名前で検索可能なフルテキスト索引を作成します。

import module "oxh:text";
import module "oxh:solr";
for $line in text:collection("mydata/users.txt")
let $split := fn:tokenize($line, ":")
let $id := $split[1]
let $name := $split[2]
return solr:put(
<doc>
<field name="id">{ $id }</field>
<field name="name">{ $name }</field>
</doc>
)

2番目の問合せは同じ結果となりますが、カスタムput関数を使用します。また、関数の注釈を使用することですべての構成パラメータを定義します。そのため、この問合せを実行するときに構成パラメータを設定する必要はありません。

import module "oxh:text";
declare %solr:put %solr-property:go-live %solr-property:zk-host("/solr") %solr-property:collection("collection1")
function local:my-solr-put($doc as element(doc)) external;
for $line in text:collection("mydata/users.txt")
let $split := fn:tokenize($line, ":")
let $id := $split[1]
let $name := $split[2]
return local:my-solr-put(
<doc>
<field name="id">{ $id }</field>
<field name="name">{ $name }</field>
</doc>
)

5.6.5 Solrアダプタ構成プロパティ

Solrアダプタ構成プロパティは、Solr MapReduceIndexerToolオプションに対応します。

MapReduceIndexerToolは、入力ファイルからSolr索引のシャードを作成し、索引をHDFSに書き込むMapReduceバッチ・ジョブ・ドライバです。また出力シャードのライブSolrサーバー(通常、SolrCloud)へのマージもサポートします。

これらのプロパティは、汎用の-confおよび-D hadoopコマンドライン・オプションを使用してOracle XQuery for Hadoopに指定できます。この方法を使用して指定されるプロパティは、問合せ内のすべてのSolrアダプタput関数に適用されます。hadoopコマンドライン・オプションの詳細は、「問合せの実行」、特に「汎用オプション」を参照してください。

あるいは、%solr-property接頭辞を使用して、これらのプロパティをSolrアダプタのput関数の注釈として指定できます。これらの注釈はプロパティの説明で特定されます。注釈は、宣言にその注釈があるSolrアダプタの特定のput関数にのみ適用されます。

関連項目:

SolrによるMapReduceIndexerToolオプションの使用方法に関する説明は、次のサイトのCloudera Searchユーザー・ガイドを参照してください。

http://www.cloudera.com/content/cloudera-content/cloudera-docs/Search/latest/Cloudera-Search-User-Guide/csug_mapreduceindexertool.html

プロパティ

概要

oracle.hadoop.xquery.solr.loader.collection

型: String

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

同等の注釈: %solr-property:collection

説明: 索引のマージのためのSolrCloudコレクション(mycollectionなど)。このプロパティをoracle.hadoop.xquery.solr.loader.go-liveおよびoracle.hadoop.xquery.solr.loader.zk-hostとともに使用します。プロパティまたは注釈のいずれかとして必須です。

oracle.hadoop.xquery.solr.loader.fair-scheduler-pool

型: String

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

同等の注釈:%solr-property:fair-scheduler-pool

説明: ジョブを発行するための適正なスケジューラ・プールの名前。デフォルトHadoopスケジューリング・メソッドではなく、適正なスケジューリングを使用してジョブが実行されます。オプション。

oracle.hadoop.xquery.solr.loader.go-live

タイプ: 文字列値trueまたはfalse

デフォルト値: false

同等の注釈: %solr-property:go-live

説明: 最終索引をライブSolrクラスタにマージできるようにするにはtrueに設定します。このプロパティをoracle.hadoop.xquery.solr.loader.collectionおよびoracle.hadoop.xquery.solr.loader.zk-hostとともに使用します。オプション。

oracle.hadoop.xquery.solr.loader.go-live-threads

型: Integer

デフォルト値: 1000

同等の注釈: %solr-property:go-live-threads

説明: 並行に実行できるライブ・マージの最大数。オプション。

oracle.hadoop.xquery.solr.loader.log4j

型: String

デフォルト値:

同等の注釈: %solr-property:log4j

説明: ローカル・ファイル・システムにあるlog4j.properties構成ファイルの相対パスまたは絶対パス。/path/to/log4j.propertiesなどです。オプション。

ファイルは、各MapReduceタスク用にアップロードされます。

oracle.hadoop.xquery.solr.loader.mappers

型: String

デフォルト値: -1

同等の注釈: %solr-property:mappers

説明: Solrが使用するマッパー・タスクの最大数。-1の値は、クラスタ上で有効なすべてのマップ・スロットの使用を可能にします。

oracle.hadoop.xquery.solr.loader.max-segments

型: String

デフォルト値: 1

同等の注釈: %solr-property:max-segments

説明: 各リデューサで生成されるセグメントの最大数。

oracle.hadoop.xquery.solr.loader.reducers

型: String

デフォルト値: -1

同等の注釈: %solr-property:reducers

説明: 使用するリデューサの数。

- -1: クラスタにあるすべてのリデュース・スロットを使用します。

- -2: 各Solr出力シャードに1つのリデューサを使用します。この設定は、MapReduce M-treeマージ・アルゴリズムを無効にします。これにより、通常スケーラビリティが向上します。

oracle.hadoop.xquery.solr.loader.zk-host

型: String

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

同等の注釈: %solr-property:zk-host

説明: SolrCloudクラスタによって使用されるZooKeeperアンサンブルのアドレス。それぞれがZooKeeperサーバーに対応する、カンマ区切りのhost:portペアのリストとしてアドレスを指定します。127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183/solrなどです。オプション。

アドレスがスラッシュ(/)で始まる場合(/solrなど)、Oracle XQuery for Hadoopは自動的にZooKeeper接続文字列からアドレスに接頭辞を付けます。

このプロパティによってSolrは作成する出力シャードの数および出力シャードをマージするSolr URLの数を決定します。このプロパティをoracle.hadoop.xquery.solr.loader.collectionおよびoracle.hadoop.xquery.solr.loader.goliveとともに使用します。プロパティまたは注釈のいずれかとして必須です。

5.7 テキスト・ファイル・アダプタ

テキスト・ファイル・アダプタは、HDFSに格納されているテキスト・ファイルの読取りおよび書込みを実行する関数を提供します。この項の内容は次のとおりです。

- テキスト・ファイルの読取りおよび書込みを実行する組込み関数

- テキスト・ファイルを読み取るカスタム関数

- テキスト・ファイルを書き込むカスタム関数

- テキスト・ファイル・アダプタの関数の例

5.7.1 テキスト・ファイルの読取りおよび書込みを実行する組込み関数

問合せで組込み関数を使用するには、次のようにテキスト・ファイル・モジュールをインポートする必要があります。

import module "oxh:text";

テキスト・ファイル・モジュールには、次の関数が含まれています。

- text:collection

- text:collection-xml

- text:put

- text:put-xml

- text:trace

例については、「テキスト・ファイル・アダプタの関数の例」を参照してください。

5.7.1.1 text:collection

HDFS内のテキスト・ファイルのコレクションにアクセスします。ファイルは、Hadoopでサポートされている圧縮コーデックを使用して圧縮できます。これらは読取り時に自動的に解凍されます。

ファイルを分割して、複数のタスクで並列で処理できます。

シグネチャ

declare %text:collection("text") function
text:collection($uris as xs:string*) as xs:string* external;

declare %text:collection("text") function
function text:collection($uris as xs:string*, $delimiter as xs:string?) as xs:string* external;

パラメータ

$uris: テキスト・ファイルのURI。

$delimiter: ファイルを分割するカスタム・デリミタ。デフォルトは改行文字です。

戻り値

デリミタによって特定される各ファイル・セグメントに1つの文字列値。デフォルトのデリミタの場合、各ファイル内の各行に1つの文字列値

5.7.1.2 text:collection-xml

HDFS内のテキスト・ファイルのコレクションにアクセスします。ファイルは、Hadoopでサポートされている圧縮コーデックを使用して圧縮できます。これらは読取り時に自動的に解凍されます。

ファイルを分割して、複数のタスクで並列で処理できます。関数によって、各ファイルの各デリミタ付きセクションはXMLドキュメントとして解析されて返されます。したがって、各セグメントには1つのXMLドキュメントが完全に含まれ、XMLの区切り文字はXML文字参照を使用してエスケープされる必要があります。デフォルトでは、デリミタは改行です。

シグネチャ

declare %text:collection("xml") function
text:collection-xml($uris as xs:string*) as document-node()* external;

declare %text:collection("xml") function
text:collection-xml($uris as xs:string*, $delimiter as xs:string?) as document-node()* external;

パラメータ

$uris: テキスト・ファイルのURI。

$delimiter: ファイルを分割するカスタム・デリミタ。デフォルトは改行文字です。

戻り値

デリミタによって特定される各ファイル・セグメントに1つの文字列値。デフォルトのデリミタの場合、各ファイル内の各行に1つの文字列値

5.7.1.3 text:put

行を、問合せの出力ディレクトリ内のテキスト・ファイルに書き込みます。行は1つ以上のファイルに展開されます。

シグネチャ

declare %text:put("text") function
text:put($value as xs:string) external;

パラメータ

$value: 書き込むテキスト

戻り値

empty-sequence()

注意

作成されるファイル数は、問合せがどのように複数のタスクに分散されているかによって異なります。各ファイルの名前はpartで始まります(例: part-m-00000)。問合せの実行時に、出力ディレクトリを指定します。「問合せの実行」を参照してください。

5.7.1.4 text:put-xml

XMLをテキスト・ファイルの行に書き込みます。行は、問合せの出力ディレクトリ内の1つ以上のファイルに展開されます。

XMLが複数の行にスパンしないように、シリアライズされたXMLの改行文字は文字参照に置換されます。たとえば、&#xA;は改行文字(\n)に置換されます。

シグネチャ

declare %text:put("xml") function
text:put-xml($value as node()) external;

パラメータ

$value: 書き込むXML

戻り値

empty-sequence()

注意

作成されるファイル数は、問合せがどのように複数のタスクに分散されているかによって異なります。各ファイルの名前はpartで始まります(例: part-m-00000)。問合せの実行時に、出力ディレクトリを指定します。「問合せの実行」を参照してください。

5.7.1.5 text:trace

行を、問合せの出力ディレクトリ内にあるtrace-*という名前のテキスト・ファイルに書き込みます。行は1つ以上のファイルに展開されます。

この関数を使用すると、別の出力に簡単に書き込むことができます。たとえば、トレース・ファイルを作成して問合せ内の無効な行を識別しながら、データをOracleデータベース表にロードできます。

シグネチャ

declare %text:put("text") %text:file("trace") function
text:trace($value as xs:string) external;

パラメータ

$value: 書き込むテキスト

戻り値

empty-sequence()

5.7.2 テキスト・ファイルを読み取るカスタム関数

次の注釈を使用して、HDFS内のテキスト・ファイルのコレクションを読み取る関数を定義できます。これらの注釈によって、組込み関数では使用できない追加機能を使用できます。

入力ファイルは、Hadoopでサポートされている圧縮コーデックを使用して圧縮できます。これらは読取り時に自動的に解凍されます。

シグネチャ

テキスト・ファイルを読み取るカスタム関数には、次のいずれかのシグネチャが必要です。

declare %text:collection("text") [additional annotations]
function local:myFunctionName($uris as xs:string*, $delimiter as xs:string?) as xs:string* external;

declare %text:collection("text") [additional annotations]
function local:myFunctionName($uris as xs:string*) as xs:string* external;

declare %text:collection("xml") [additional annotations]
function local:myFunctionName($uris as xs:string*, $delimiter as xs:string?) as document-node()* external

declare %text:collection("xml") [additional annotations]
function local:myFunctionName($uris as xs:string*) as document-node()* external;

注釈

%text:collection(["method"])

text collection関数を宣言します。必須。

オプションのmethodパラメータは次のいずれかの値です。

- text: テキスト・ファイルの各行はxs:stringとして返されます。デフォルト。

- xml: テキスト・ファイルの各行はXMLとして解析され、document-nodeとして返されます。各XMLドキュメントは、1行に完全に含まれる必要があります。ドキュメント内の改行文字は、数値の文字参照によって表される必要があります。

%text:split("delimiter")

入力ファイルを分割するためのカスタム・デリミタを指定します。デフォルトのデリミタは改行文字です。

この注釈と$delimiterパラメータを組み合せないでください。カスタム・デリミタを指定するには、この注釈または$delimiterパラメータのいずれかを使用します。

%text:split-max("split-size")

最大分割サイズを整数または文字列値で指定します。分割サイズによって、入力ファイルがタスクに分割される方法を制御します。Hadoopは、分割サイズをmax($split-min, min($split-max, $block-size))で計算します。オプション。

文字列値の場合、バイト(デフォルトの単位)のかわりに、K、k、M、m、Gまたはgを値に追加してキロバイト、メガバイトまたはギガバイトを表すことができます。これらの修飾子は大文字と小文字を区別しません。次の例は同等です。

%text:split-max(1024)
%text:split-max("1024")
%text:split-max("1K")

%text:split-min("split-size")

最小分割サイズを整数または文字列値で指定します。分割サイズによって、入力ファイルがタスクに分割される方法を制御します。Hadoopは、分割サイズをmax($split-min, min($split-max, $block-size))で計算します。オプション。

文字列値の場合、バイト(デフォルトの単位)のかわりに、K、k、M、m、Gまたはgを値に追加してキロバイト、メガバイトまたはギガバイトを表すことができます。これらの修飾子は大文字と小文字を区別しません。次の例は同等です。

%text:split-min(1024)
%text:split-min("1024")
%text:split-min("1K")

パラメータ

$uris as xs:string*

HDFSファイルのURIをリストします。ファイルは、Hadoopでサポートされているコーデックを使用して解凍または圧縮できます。必須。

$delimiter as xs:string?

入力テキスト・ファイルを分割するカスタム・デリミタ。デフォルトのデリミタは改行です。このパラメータと%text:split注釈を組み合せないでください。

戻り値

text方法の場合: xs:string*

xml方法の場合: document-node()*

5.7.3 テキスト・ファイルを書き込むカスタム関数

次の注釈を使用して、HDFS内のテキスト・ファイルを書き込む関数を定義できます。

シグネチャ

テキスト・ファイルを書き込むカスタム関数には、次のいずれかのシグネチャが必要です。

declare %text:put("text") [additional annotations] function
text:myFunctionName($value as xs:string) external;

declare %text:put("xml") [additional annotations] function
text:myFunctionName($value as node()) external;

注釈

%text:put(["method"])

text put関数を宣言します。必須。

オプションのmethodパラメータは次のいずれかの値です。

- text: データをテキスト・ファイルに書き込みます。デフォルト。

- xml: データをXMLファイルに書き込みます。XMLはシリアライズされ、改行文字は文字参照に置換されます。このプロセスによって、結果のXMLドキュメントは改行のない1行のテキスト行になります。

%text:compress("codec")

出力で使用する圧縮形式を指定します。デフォルトは圧縮なしです。オプション。

codecパラメータは圧縮コーデックを識別します。値が一致して、最初に登録された圧縮コーデックが使用されます。値は、次のいずれかと等しい場合にコーデックに一致します。

1. コーデックの完全修飾されたクラス名

2. コーデックの修飾されていないクラス名

3. Codec (大文字と小文字を区別しない)の前にある、修飾されていないクラス名の接頭辞

次のすべての例では、デフォルトのコーデックおよびブロック圧縮を使用します。

%text:compress("org.apache.hadoop.io.compress.DefaultCodec", "block")
%text:compress("DefaultCodec", "block")
%text:compress("default", "block")

%text:file("name")

出力ファイル名の接頭辞を指定します。デフォルトの接頭辞はpartです。

%output:parameter

%text:putで指定される出力方法(テキストまたはXML)に対する標準XQueryシリアライズ・パラメータ。「シリアライズ注釈」を参照してください。

現在、サポートされている文字エンコードはUTF-8のみです。

5.7.4 テキスト・ファイル・アダプタの関数の例

例5-19 組込み関数を使用したテキスト・ファイルの問合せ

この例では、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

次の問合せは、johnがアクセスしたページをフィルタ処理し、アクセスした日付とページのみを新規テキスト・ファイルに書き込みます。

import module "oxh:text";

for $line in text:collection("mydata/visits*.log")
let $split := fn:tokenize($line, "\s*,\s*")
where $split[2] eq "john"
return
text:put($split[1] || " " || $split[3])

この問合せは、次の行を含むテキスト・ファイルを作成します。

2013-10-28T06:00:00 index.html
2013-10-30T10:00:01 index.html
2013-10-30T10:05:20 about.html

次の問合せは、ページに対する1日当たりのアクセス数を計算します。

import module "oxh:text";

for $line in text:collection("mydata/visits*.log")
let $split := fn:tokenize($line, "\s*,\s*")
let $time := xs:dateTime($split[1])
let $day := xs:date($time)
group by $day
return
text:put($day || " => " || count($line))

この問合せは、次の行を含むテキスト・ファイルを作成します。

2013-10-28 => 3
2013-10-30 => 3
2013-11-01 => 1
2013-11-04 => 2

例5-20 単純なデリミタ付き形式の問合せ

この例は、fn:tokenize関数を使用して、テキスト・ファイルの行を解析します。この方法は、単純なデリミタ付き形式に適しています。

次の問合せは、カスタムのput関数およびcollection関数を宣言します。これは、ログ内のページごとに、ヒット数および一意のユーザー数を計算します。

import module "oxh:text";

declare
%text:collection("text")
%text:split-max("32m")
function local:col($uris as xs:string*) as xs:string* external;

declare
%text:put("xml")
%text:compress("gzip")
%text:file("pages")
function local:out($arg as node()) external;

for $line in local:col("mydata/visits*.log")
let $split := fn:tokenize($line, "\s*,\s*")
let $user := $split[2]
let $page := $split[3]
group by $page
return
local:out(
<page>
<name>{$page}</name>
<hits>{count($line)}</hits>
<users>{fn:count(fn:distinct-values($user))}</users>
</page>
)

前の問合せの出力ディレクトリ名はmyoutputです。次の行がmyoutput/pages-r-*.gzに書き込まれます。

<page><name>about.html</name><hits>2</hits><users>2</users></page>
<page><name>contact.html</name><hits>1</hits><users>1</users></page>
<page><name>index.html</name><hits>6</hits><users>4</users></page>

ファイルはgzipコーデックを使用して圧縮されます。次の問合せは、出力ファイルを読み取り、ページ名と合計ヒット数をプレーン・テキストとして書き込みます。collection関数によって、圧縮ファイルが自動的にデコードされます。

import module "oxh:text";

for $page in text:collection-xml("myoutput/page*.gz")/page
return
text:put($page/name || "," || $page/hits)

この問合せは、次の行を含むテキスト・ファイルを作成します。

about.html,2
contact.html,1
index.html,6

例5-21 複雑なテキスト形式の問合せ

fn:tokenize関数は、様々なデータ型やデリミタを含む複雑な形式には適していません。この例は、fn:analyze-string関数を使用して、Apache共通ログ形式のログ・ファイルを処理します。

HDFS内のmydata/access.logという名前のテキスト・ファイルには、次の行が含まれています。

192.0.2.0 - - [30/Sep/2013:16:39:38 +0000] "GET /inddex.html HTTP/1.1" 404 284
192.0.2.0 - - [30/Sep/2013:16:40:54 +0000] "GET /index.html HTTP/1.1" 200 12390
192.0.2.4 - - [01/Oct/2013:12:10:54 +0000] "GET /index.html HTTP/1.1" 200 12390
192.0.2.4 - - [01/Oct/2013:12:12:12 +0000] "GET /about.html HTTP/1.1" 200 4567
192.0.2.1 - - [02/Oct/2013:08:39:38 +0000] "GET /indexx.html HTTP/1.1" 404 284
192.0.2.1 - - [02/Oct/2013:08:40:54 +0000] "GET /index.html HTTP/1.1" 200 12390
192.0.2.1 - - [02/Oct/2013:08:42:38 +0000] "GET /aobut.html HTTP/1.1" 404 283

次の問合せは、サーバーがステータス・コード404 (見つかりません)エラーを返した場合に、2013年9月以降に行われた要求を計算します。正規表現およびfn:analyze-stringを使用して、ログ・エントリのコンポーネントを照合します。例5-20に示すように、時間書式はxs:dateTimeに直接キャストできません。かわりに、ora-fn:dateTime-from-string-with-format関数によって、文字列をxs:dateTimeのインスタンスに変換します。

import module "oxh:text";

declare variable $REGEX :=
'(\S+) (\S+) (\S+) \[([^\]]+)\] "([^"]+)" (\S+) (\S+)';

for $line in text:collection("mydata/access.log")
let $match := fn:analyze-string($line, $REGEX)/fn:match
let $time :=
ora-fn:dateTime-from-string-with-format(
"dd/MMM/yyyy:HH:mm:ss Z",
$match/fn:group[4]
)
let $status := $match/fn:group[6]
where
$status eq "404" and
$time ge xs:dateTime("2013-10-01T00:00:00")
let $host := $match/fn:group[1]
let $request := $match/fn:group[5]
return
text:put($host || "," || $request)

この問合せは、次の行を含むテキスト・ファイルを作成します。

192.0.2.1,GET /indexx.html HTTP/1.1
192.0.2.1,GET /aobut.html HTTP/1.1

関連項目:

- fn:tokenize関数およびfn:analyze-string関数については、次のサイトにある『XPath and XQuery Functions and Operators 3.0』仕様
http://www.w3.org/TR/xpath-functions-30/#func-tokenize

http://www.w3.org/TR/xpath-functions-30/#func-analyze-string

- Apache共通ログ形式については、次のサイトを参照してください。
http://httpd.apache.org/docs/current/logs.html

5.8 Tikaファイル・アダプタ

このアダプタは、Apache Tikaライブラリを使用して様々な形式でHDFSに格納されているファイルを解析するための関数を提供します。この項の内容は次のとおりです。

- Tikaを使用してファイルを解析するための組込みライブラリ関数

- Tikaを使用してファイルを解析するためのカスタム関数

- Tikaパーサーの出力形式

- Tikaアダプタの構成プロパティ

- Tikaファイル・アダプタの関数の例

5.8.1 Tikaを使用してファイルを解析するための組込みライブラリ関数

問合せで組込み関数を使用するには、次のようにTikaファイル・モジュールをインポートする必要があります。

import module "oxh:tika";

Tikaファイル・モジュールには、次の関数が含まれています。

例については、「Tikaファイル・アダプタの関数の例」を参照してください。

5.8.1.1 tika:collection

様々な形式でHDFSに格納されているファイルを解析し、それらのファイルからコンテンツまたはメタデータを抽出します。

シグネチャ

declare %tika:collection function
tika:collection($uris as xs:string*) as document-node()* external;

declare %tika:collection function
function tika:collection($uris as xs:string*, $contentType as xs:string?) as document-node()* external;

パラメータ

$uris: HDFSファイルのURI。

$contentType: 解析するコンテンツのメディア・タイプを指定するもので、charset属性を含めることができます。パラメータを指定する場合、タイプとエンコーディングの両方を定義します。指定しない場合、Tikaはファイル拡張子から値の自動検出を試行します。パラメータを指定することをお薦めします。

戻り値

各値に対して1つのドキュメント・ノードが返されます。「Tikaパーサーの出力形式」を参照してください。

5.8.1.2 tika:parse

引数として提供されたデータを解析します。たとえば、XMLまたはJSONドキュメント内のhtmlフラグメントを解析できます。

シグネチャ

declare function
tika:parse($data as xs:string?, $contentType as xs:string?) as document-node()* external;

パラメータ

$data: 解析する値。

$contentType: 解析するコンテンツのメディア・タイプを指定するもので、charset属性を含めることができます。パラメータを指定する場合、タイプとエンコーディングの両方を定義します。指定しない場合、Tikaはファイル拡張子から値の自動検出を試行します。パラメータを指定することをお薦めします。

戻り値

各値に対して1つのドキュメント・ノードが返されます。「Tikaパーサーの出力形式」を参照してください。

5.8.2 Tikaを使用してファイルを解析するためのカスタム関数

次の注釈を使用すると、Tikaを使用してHDFS内のファイルを解析する関数を定義できます。これらの注釈によって、組込み関数では使用できない追加機能を使用できます。

シグネチャ

HDFSファイルを読み取るカスタム関数には、次のいずれかのシグネチャが必要です。

declare %tika:collection [additional annotations]
function local:myFunctionName($uris as xs:string*, $contentType as xs:string?) as document-node()* external;
declare %tika:collection [additional annotations]
function local:myFunctionName($uris as xs:string*) as document-node()* external;

注釈

%tika:collection(["method"])

Tikaファイル・アダプタにより実装される外部関数を識別します。必須。

オプションのmethodパラメータは次のいずれかの値です。

- tika: tikaファイル内の各行がdocument-node()として返されます。デフォルト。

%output:media-type

ファイル・コンテンツ・タイプを宣言します。これはMIMEタイプであり、XQuery仕様に従ってcharset属性を持つことができません。オプション。

%output:encoding

ファイル文字セットを宣言します。オプション。

注意:

%output:media-type注釈と%output:econding注釈は、シグネチャ内に$contentTypeが明示的に指定されていないときのコンテンツ・タイプまたはエンコーディングを指定します。

パラメータ

$uris as xs:string*

HDFSファイルのURIをリストします。必須。

$contentType as xs:string?

ファイル・コンテンツ・タイプ。charset属性を持つことができます。

戻り値

document-node()*および2つのルート要素。「Tikaパーサーの出力形式」を参照してください。

5.8.3 Tikaパーサーの出力形式

Tika解析の結果は、1つのドキュメント・ノードと2つのルート要素です。

- ルート要素#1は、Tikaにより生成されたXHTMLコンテンツです。

- ルート要素#2は、Tikaにより抽出されたドキュメント・メタデータです。

ルート要素の形式は次のようになります。

ルート要素#1

<html xmlns="http://www.w3.org/1999/xhtml">
...textual content of Tika HTML...
</html>

ルート要素#2

<tika:metadata xmlns:tika="oxh:tika">
<tika:property name="Name_1">VALUE_1</tika:property>
<tika:property name="NAME_2">VALUE_2</tika:property>
</tika:metadata>

5.8.4 Tikaアダプタの構成プロパティ

次のHadoopプロパティは、Tikaアダプタの動作を制御します。

oracle.hadoop.xquery.tika.html.asis

型: ブール

デフォルト値: false。

説明: これをTRUEに設定すると、解析中にすべてのHTML要素が省略されます。これをFALSEに設定すると、解析中に安全な要素が省略されます。

oracle.hadoop.xquery.tika.locale

型: 文字列のカンマ区切りのリスト

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

説明: Microsoft Officeドキュメント・パーサーなどの一部のTikaパーサーにより使用されるロケールを定義します。使用できる文字列は、language、countryおよびvariantの3つのみです。文字列countryおよびvariantはオプションです。ロケールを定義しない場合、システム・ロケールが使用されます。文字列を定義する場合、その文字列はhttp://docs.oracle.com/javase/7/docs/api/java/util/Locale.htmlに記載されているjava.util.Locale仕様形式に対応している必要があり、ロケールは次のように構成できます。

- languageのみを指定した場合、ロケールは言語から構成されます。

- languageおよびcountryを指定した場合、ロケールは言語と国の両方から構成されます。

- language、countryおよびvariantを指定した場合、ロケールは言語、国およびバリアントから構成されます。

5.8.5 Tikaファイル・アダプタの関数の例

例5-22 組込み関数を使用したCloudera SearchによるPDFドキュメントの索引付け

この問合せ例では、Tikaを使用してPDFファイルをHTMLフォームに解析し、HTMLドキュメントをSolrのフルテキスト索引に追加します。

*bigdata*.pdf

次の問合せでは、HDFSファイルを索引付けします。

import module "oxh:tika";
import module "oxh:solr";

for $doc in tika:collection("*bigdata*.pdf")
let $docid := data($doc//*:meta[@name eq "resourceName"]/@content)[1]
let $body := $doc//*:body[1]
return
solr:put(
<doc>
<field name="id">{ $docid }</field>
<field name="text">{ string($body) }</field>
<field name="content">{ serialize($doc/*:html) }</field>
</doc>
)

ドキュメントのHTML表現がSolr索引に追加され、検索可能になります。索引内の各ドキュメントIDはファイル名です。

例5-23 組込み関数を使用したCloudera SearchによるHTMLドキュメントの索引付け

この問合せ例では、順序ファイルおよびTikaを使用して解析を行います(キーがURLで値がhtmlです)。

import module "oxh:tika";
import module "oxh:solr";
import module "oxh:seq";

for $doc in seq:collection-tika(“/path/to/seq/files/*")
let $docid := document-uri($doc)
let $body := $doc//*:body[1]
return
solr:put(
<doc>
<field name="id">{ $docid }</field>
<field name="text">{ string($body) }</field>
<field name="content">{ serialize($doc/*:html) }</field>
</doc>
)

ドキュメントのHTML表現がSolr索引に追加され、検索可能になります。索引内の各ドキュメントIDはファイル名です。

5.9 XMLファイル・アダプタ

XMLファイル・アダプタは、HDFSに格納されたXMLファイルへのアクセスを提供します。アダプタは必要に応じて個々のXMLファイルを分割するため、1つのファイルを複数のタスクで並列で処理できます。

次のトピックでは、このアダプタについて説明します。

- XMLファイルを読み取る組込み関数

- XMLファイルを読み取るカスタム関数

- XMLファイル・アダプタの関数の例

5.9.1 XMLファイルを読み取る組込み関数

問合せで組込み関数を使用するには、次のようにXMLファイル・モジュールをインポートする必要があります。

import module "oxh:xmlf";

XMLファイル・モジュールには、次の関数が含まれています。

- xmlf:collection (単一のタスク)

- xmlf:collection-multipart (単一のタスク)

- xmlf:collection (複数のタスク)

「XMLファイル・アダプタの関数の例」を参照してください。

5.9.1.1 xmlf:collection (単一のタスク)

HDFS内のXMLドキュメントのコレクションにアクセスします。複数のファイルを同時に処理できますが、個々のファイルは1つのタスクによって解析されます。

Hadoopでサポートされているコーデックを使用して圧縮されたファイルは、この関数によって自動的に解凍されます。

注意:

データが多数の小さいファイルに格納されている場合、HDFSは適切に実行されません。多数の小さいXMLドキュメントを含む大規模なデータセットの場合は、Hadoop順序ファイルおよび順序ファイル・アダプタを使用します。

シグネチャ

declare %xmlf:collection function
xmlf:collection($uris as xs:string*) as document-node()* external;

パラメータ

$uris: XMLファイルのURI

戻り値

各ファイルに対して1つのXMLドキュメント

5.9.1.2 xmlf:collection-multipart (単一のタスク)

HDFS内のXMLドキュメントのコレクションにアクセスします。複数のファイルを同時に処理できますが、個々のファイルは1つのタスクによって解析されます。この関数はxmlf:collectionと同じですが、一緒に連結された複数の整形式XMLドキュメントを各ファイルに含めることができる点が異なります。

Hadoopでサポートされているコーデックを使用して圧縮されたファイルは、この関数によって自動的に解凍されます。たとえば、GZIPを使用して圧縮された複数のXMLドキュメントを含むファイルに、この関数を使用して直接アクセスできます。

シグネチャ

declare %xmlf:collection("multipart")
function    xmlf:collection($uris as xs:string*) as document-node()* external;

パラメータ

$uris

XMLファイルのURI

戻り値

各ファイルに対して1つ以上のXMLドキュメント。

5.9.1.3 xmlf:collection (複数のタスク)

HDFS内のXMLドキュメントのコレクションにアクセスします。ファイルを分割して、複数のタスクで同時に処理できるため、非常に大きなXMLファイルを効率的に処理できます。この関数は、指定した名前に一致する要素のみを返します。

この関数によってファイルは自動的に解凍されません。特定の要件を満たすXMLファイルのみをサポートしています。「XMLファイルを分割する際の制限」を参照してください。

シグネチャ

declare %xmlf:collection function
xmlf:collection($uris as xs:string*, $names as xs:anyAtomicType+) as element()* external;

パラメータ

$uris

XMLファイルのURI

$names

関数によって返される要素の名前。名前は、文字列またはQNameのいずれかです。QNameの場合、XMLパーサーは、QNameの接頭辞とネームスペースによって暗黙的に示されるネームスペース・バインディングを使用します。

戻り値

$names引数によって指定された名前の1つと一致する各要素

5.9.2 XMLファイルを読み取るカスタム関数

次の注釈を使用して、HDFS内のXMLファイルのコレクションを読み取る関数を定義できます。これらの注釈によって、組込み関数では使用できない追加機能を使用できます。

シグネチャ

XMLファイルを読み取るカスタム関数には、次のいずれかのシグネチャが必要です。

declare %xmlf:collection(["xml"|"multipart"]) [additional annotations]
function local:myFunctionName($uris as xs:string*) as node()* external;

declare %xmlf:collection("xml") [additional annotations]
function local:myFunctionName($uris as xs:string*, $names as xs:anyAtomicType+) as element()* external;

注釈

%xmlf:collection

collection関数を宣言します。必須。

methodパラメータは次のいずれかの値です。

- xml: 各値はXMLとして解析されます

- multipart: 各値(またはファイル)には、複数の整形式XMLドキュメントの連結が含まれている場合があります。このメソッドは、パラレルXML解析とともに使用することはできません。(xmlf:splitおよび2つの引数の関数のシグネチャを参照してください。)

%xmlf:split("element-name1"[,... "element-nameN")

並列のXML解析で使用する要素名を指定します。この注釈は、$names引数のかわりに使用できます。

この注釈を指定すると、1つの引数を取る関数のみ使用できます。この制限によって、要素名を静的に指定できるため、関数の呼出し時に要素名を指定する必要がありません。

%output:encoding("charset")

入力ドキュメントのテキスト・エンコードを識別します。

このエンコードを%xmlf:split注釈または$names引数とともに使用する場合、有効なエンコードはISO-8859-1、US-ASCIIおよびUTF-8のみです。そうでない場合、有効なエンコードは、JVMでサポートされているエンコードです。この注釈を省略すると、UTF-8とみなされます。

関連項目:

次のサイトにあるOracle Java SEドキュメントのサポートされているエンコードに関する項

http://docs.oracle.com/javase/7/docs/technotes/guides/intl/encoding.doc.html

%xmlf:split-namespace("prefix", "namespace")

この注釈は、追加のネームスペース宣言をパーサーに提供します。これを複数回指定して、1つ以上のネームスペースを宣言できます。

この注釈を使用して、祖先要素のネームスペースを宣言します。XMLが並列で処理される場合は、指定した名前に一致する要素のみがXMLパーサーによって処理されます。一致する要素が祖先要素の1つのネームスペース宣言に依存する場合、パーサーは宣言を識別できず、エラーが発生する場合があります。

これらのネームスペース宣言は、分割名を指定するときに要素名でも使用できます。次に例を示します。

declare
%xmlf:collection
%xmlf:split("eg:foo")
%xmlf:split-namespace("eg", "http://example.org")
function local:myFunction($uris as xs:string*) as document-node() external;

%xmlf:split-entity("entity-name", "entity-value")

エンティティ定義をXMLパーサーに提供します。XMLが並列で処理される場合は、指定した分割名に一致する要素のみがXMLパーサーによって処理されます。分割されて並列で処理される入力ドキュメントのDTDは処理されません。

この例では、XMLパーサーが&foo;エンティティ参照を"Hello World"として拡張します。

%xmlf:split-entity("foo","Hello World")

%xmlf:split-max("split-size")

最大分割サイズを整数または文字列値で指定します。分割サイズによって、入力ファイルがタスクに分割される方法を制御します。Hadoopは、分割サイズをmax($split-min, min($split-max, $block-size))で計算します。オプション。

文字列値の場合、バイト(デフォルトの単位)のかわりに、K、k、M、m、Gまたはgを値に追加してキロバイト、メガバイトまたはギガバイトを表すことができます。これらの修飾子は大文字と小文字を区別しません。次の例は同等です。

%xmlf:split-max(1024)
%xmlf:split-max("1024")
%xmlf:split-max("1K")

%xmlf:split-min("split-size")

最小分割サイズを整数または文字列値で指定します。分割サイズによって、入力ファイルがタスクに分割される方法を制御します。Hadoopは、分割サイズをmax($split-min, min($split-max, $block-size))で計算します。オプション。

文字列値の場合、バイト(デフォルトの単位)のかわりに、K、k、M、m、Gまたはgを値に追加してキロバイト、メガバイトまたはギガバイトを表すことができます。これらの修飾子は大文字と小文字を区別しません。次の例は同等です。

%xmlf:split-min(1024)
%xmlf:split-min("1024")
%xmlf:split-min("1K")

注意

XMLファイルを分割する際の制限

$names引数または$xmlf:split注釈を使用して要素名が指定されている場合は、各XMLドキュメントを並列で処理できます。

並列で処理するには、入力ドキュメントが次の制約を満たしている必要があります。

- XMLには、コメント、CDATAセクション、または指定した要素名(つまり、<文字の後にQNameに拡張する名前が続く)の1つに一致するテキストを含む処理手順を含めることができません。そうすると、内容は要素として正しく解析されません。

- 指定した要素名に一致するファイル内の要素には、指定した名前に一致する子孫要素を含めることができません。そうすると、複数のプロセッサが一致する子孫を選択でき、関数は正しい結果を生成できません。

- 指定した要素名(およびその子孫すべて)の1つに一致する要素は、そのいずれかの祖先のネームスペース宣言に依存できません。一致する要素の祖先は解析されないため、これらの要素のネームスペース宣言は処理されません。
この制限を回避するには、%xmlf:split-namespace注釈を使用してネームスペース宣言を手動で指定します。

指定した要素名は、分割サイズより大きいファイル内の要素と照合しないことをお薦めします。それを行うと、アダプタは正しく機能しますが、効率が悪くなります。

解析はXMLファイルの途中から開始できないため、XMLを並列で処理するのは困難です。XML構造体(CDATAセクション、コメント、ネームスペース宣言など)によって、この制限が発生します。XMLドキュメントの途中から開始するパーサーは、ドキュメントの先頭に向かって逆方向検索してCDATAセクションまたはコメント内にいないことを確認せずに、たとえば、文字列<foo>が開始要素タグであるとみなすことはできません。ただし、通常、大規模なXMLドキュメントには同様に構造化された一連の要素が含まれるため、並列処理の対象になります。要素名を指定すると、各タスクは、指定した名前の1つに一致する要素についてドキュメントの一部をスキャンして実行されます。指定した名前に一致する要素のみ、実際のXMLパーサーに渡されます。したがって、並列プロセッサでは、ドキュメント全体の真の意味での解析は実行されません。

5.9.3 XMLファイル・アダプタの関数の例

例5-24 組込み関数を使用したXMLファイルの問合せ

この例は、次の内容でHDFS内の3つのXMLファイルを問い合せます。各XMLファイルには、特定の日にユーザーが記入したコメントが含まれています。各コメントには、他のユーザーからのlikeが1個以上あるか、likeがない場合もあります。

mydata/comments1.xml

<comments date="2013-12-30">
<comment id="12345" user="john" text="It is raining :( "/>
<comment id="56789" user="kelly" text="I won the lottery!">
<like user="john"/>
<like user="mike"/>
</comment>
</comments>

mydata/comments2.xml

<comments date="2013-12-31">
<comment id="54321" user="mike" text="Happy New Year!">
<like user="laura"/>
</comment>
</comments>

mydata/comments3.xml

<comments date="2014-01-01">
<comment id="87654" user="mike" text="I don't feel so good."/>
<comment id="23456" user="john" text="What a beautiful day!">
<like user="kelly"/>
<like user="phil"/>
</comment>
</comments>

この問合せは、各年に記入されたコメントの数をテキスト・ファイルに書き込みます。xmlf:collectionに渡される要素名はないため、3つのドキュメント(各ファイルに1つ)を返します。各ファイルは、単一のタスクによって順次処理されます。

import module "oxh:xmlf";
import module "oxh:text";

for $comments in xmlf:collection("mydata/comments*.xml")/comments
let $date := xs:date($comments/@date)
group by $year := fn:year-from-date($date)
return
text:put($year || ", " || fn:count($comments/comment))

この問合せは、次の行を含むテキスト・ファイルを作成します。

2013, 3
2014, 2

次の問合せでは、ユーザーごとのコメント数およびlikeの平均数を書き込みます。各入力ファイルを分割して、複数のタスクで並列で処理できます。xmlf:collection関数は、5つの要素(各コメントに1つ)を返します。

import module "oxh:xmlf";
import module "oxh:text";

for $comment in xmlf:collection("mydata/comments*.xml", "comment")
let $likeCt := fn:count($comment/like)
group by $user := $comment/@user
return
text:put($user || ", " || fn:count($comment) || ", " || fn:avg($likeCt))

この問合せは、次の行を含むテキスト・ファイルを作成します。

john, 2, 1
kelly, 1, 2
mike, 2, 0.5

例5-25 XMLファイルを問い合せるカスタム関数の書込み

次の例は、XMLファイルにアクセスするカスタム関数を宣言します。

import module "oxh:text";

declare
%xmlf:collection
%xmlf:split("comment")
%xmlf:split-max("32M")
function local:comments($uris as xs:string*) as element()* external;

for $c in local:comments("mydata/comment*.xml")
where $c/@user eq "mike"
return text:put($c/@id)

この問合せは、次の行を含むテキスト・ファイルを作成します。

54321
87654

例5-26 圧縮されたマルチパートXMLファイルへのアクセス

例5-24からのファイルcomments1.xml、comments2.xmlおよびcomments3.xmlを連結してGZIPを使用して圧縮し、comments.xml.gzという名前の1つのファイルを作成すると仮定します。次に例を示します。

cat comments1.xml comments2.xml comments3.xml | gzip > comments.xml.gz

次の問合せは、このマルチパートの圧縮されたXMLファイルにアクセスします。

import module "oxh:text"; import module "oxh:xmlf";
for $comment in xmlf:collection-multipart("comments.xml.gz")/comments/comment
return
text:put($comment/@id || "," || $comment/@user)

この問合せは、次の行を含むテキスト・ファイルを作成します。

12345,john
56789,kelly
54321,mike
87654,mike
23456,john

関連項目:

- OpenStreetMapデータをダウンロードするには、次のサイトを参照してください。
http://wiki.openstreetmap.org/wiki/Planet.osm

- OpenStreetMapのXML書式については、次のサイトを参照してください。
http://wiki.openstreetmap.org/wiki/OSM_XML

5.10 ユーティリティ・モジュール

ユーティリティ・モジュールには、文字列および日付を処理するora-fn関数が含まれています。これらの関数はXDK XQueryで定義されますが、oxh関数はOracle XQuery for Hadoop固有です。

次のトピックでは、ユーティリティ関数について説明します。

- 期間、日付および時刻のOracle XQuery関数

- 文字列のOracle XQuery関数

5.10.1 期間、日付および時刻のOracle XQuery関数

Oracle XQueryの関数を使用して、XQueryで期間、日付および時刻を操作できます。

Oracle XQuery関数はhttp://xmlns.oracle.com/xdk/xquery/functionネームスペースにあります。ネームスペースの接頭辞ora-fnは事前に宣言され、モジュールは自動的にインポートされます。

- ora-fn:date-from-string-with-format

- ora-fn:date-to-string-with-format

- ora-fn:dateTime-from-string-with-format

- ora-fn:dateTime-to-string-with-format

- ora-fn:time-from-string-with-format

- ora-fn:time-to-string-with-format

5.10.1.1 ora-fn:date-from-string-with-format

指定したパターンに従って、文字列から新しい日付値を返します。

シグネチャ

ora-fn:date-from-string-with-format($format as xs:string?,
$dateString as xs:string?,
$locale as xs:string*)
as xs:date?

ora-fn:date-from-string-with-format($format as xs:string?,
$dateString as xs:string?)
as xs:date?

パラメータ

$format: パターン。「Format引数」を参照してください

$dateString: 日付を表す入力文字列。

$locale: ロケールを表す1つから3つのフィールド値。「Locale引数」を参照してください

例

この例は、指定した日付を現在のタイムゾーンで返します。

ora-fn:date-from-string-with-format("yyyy-MM-dd G", "2013-06-22 AD")

5.10.1.2 ora-fn:date-to-string-with-format

指定したパターンを使用して日付文字列を返します。

シグネチャ

ora-fn:date-to-string-with-format($format as xs:string?,
$date as xs:date?,
*$locale as xs:string?)
as xs:string?

ora-fn:date-to-string-with-format($format as xs:string?,
$date as xs:date?)
as xs:string?

パラメータ

$format: パターン。「Format引数」を参照してください

$date: 日付

$locale: ロケールを表す1つから3つのフィールド値。「Locale引数」を参照してください

例

この例は、文字列2013-07-15を返します。

ora-fn:date-to-string-with-format("yyyy-mm-dd", xs:date("2013-07-15"))

5.10.1.3 ora-fn:dateTime-from-string-with-format

指定したパターンに従って、入力文字列から新しい日時値を返します。

シグネチャ

ora-fn:dateTime-from-string-with-format($format as xs:string?,
$dateTimeString as xs:string?,
$locale as xs:string?)
as xs:dateTime?

ora-fn:dateTime-from-string-with-format($format as xs:string?,
$dateTimeString as xs:string?)
as xs:dateTime?

パラメータ

$format: パターン。「Format引数」を参照してください

$dateTimeString: 日時。

$locale: ロケールを表す1つから3つのフィールド値。「Locale引数」を参照してください

例

この例は、指定した日付および11:04:00AMを現在のタイムゾーンで返します。

ora-fn:dateTime-from-string-with-format("yyyy-MM-dd 'at' hh:mm",
"2013-06-22 at 11:04")

次の例は、指定した日付および12:00:00AMを現在のタイムゾーンで返します。

ora-fn:dateTime-from-string-with-format("yyyy-MM-dd G",
"2013-06-22 AD")

5.10.1.4 ora-fn:dateTime-to-string-with-format

指定したパターンを使用して日時文字列を返します。

シグネチャ

ora-fn:dateTime-to-string-with-format($format as xs:string?,
$dateTime as xs:dateTime?,
$locale as xs:string?)
as xs:string?

ora-fn:dateTime-to-string-with-format($format as xs:string?,
$dateTime as xs:dateTime?)
as xs:string?

パラメータ

$format: パターン。「Format引数」を参照してください

$dateTime: 日時。

$locale: ロケールを表す1つから3つのフィールド値。「Locale引数」を参照してください

例

この例は、文字列07 JAN 2013 10:09 PM ADを返します。

ora-fn:dateTime-to-string-with-format("dd MMM yyyy hh:mm a G",
xs:dateTime("2013-01-07T22:09:44"))

次の例は、文字列"01-07-2013"を返します。

ora-fn:dateTime-to-string-with-format("MM-dd-yyyy",
xs:dateTime("2013-01-07T22:09:44"))

5.10.1.5 ora-fn:time-from-string-with-format

指定したパターンに従って、入力文字列から新しい時間値を返します。

シグネチャ

ora-fn:time-from-string-with-format($format as xs:string?,
$timeString as xs:string?,
$locale as xs:string?)
as xs:time?

ora-fn:time-from-string-with-format($format as xs:string?,
$timeString as xs:string?)
as xs:time?

パラメータ

$format: パターン。「Format引数」を参照してください

$timeString: 時間

$locale: ロケールを表す1つから3つのフィールド値。「Locale引数」を参照してください

例

この例は、9:45:22PMを現在のタイムゾーンで返します。

ora-fn:time-from-string-with-format("HH.mm.ss", "21.45.22")

次の例は、8:07:22PMを現在のタイムゾーンで返します。

fn-bea:time-from-string-with-format("hh:mm:ss a", "8:07:22 PM")

5.10.1.6 ora-fn:time-to-string-with-format

指定したパターンを使用して時間文字列を返します。

シグネチャ

ora-fn:time-to-string-with-format($format as xs:string?,
$time as xs:time?,
$locale as xs:string?)
as xs:string?

ora-fn:time-to-string-with-format($format as xs:string?, $time as xs:time?) as xs:string?

パラメータ

$format: パターン。「Format引数」を参照してください

$time: 時間

$locale: ロケールを表す1つから3つのフィールド値。「Locale引数」を参照してください

例

この例は、文字列"10:09 PM"を返します。

ora-fn:time-to-string-with-format("hh:mm a", xs:time("22:09:44"))

次の例は、文字列"22:09 PM"を返します。

ora-fn:time-to-string-with-format("HH:mm a", xs:time("22:09:44"))

5.10.1.7 Format引数

$format引数は、日付値または時間値を構成する様々なフィールドを識別します。

関連項目:

次のサイトにある『Java Standard Edition 7 Reference』のSimpleDateFormatクラスに関する項

http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

5.10.1.8 Locale引数

$localeは、地理、政治または文化によって区別される特定の地域を表します。

これは、次に示す最大3つのフィールドで定義されます。

1. 言語コード: ISO 639 alpha-2またはalpha-3の言語コード、または最大8文字の登録済言語サブタグ。たとえば、enは英語、jaは日本語です。

2. 国コード: ISO 3166 alpha-2の国コード、またはUN M.49 numeric-3の地域コード。たとえば、USは米国、029はカリブです。

3. バリアント: ロケールのバリエーション(特定の方言など)を示します。複数の値を重要度の順に順序付けて、アンダースコア(_)で区切ります。これらの値は大文字と小文字を区別します。

関連項目:

- 次のサイトにある『Java Standard Edition 7 Reference』のlocaleクラスに関する項
http://docs.oracle.com/javase/7/docs/api/java/util/Locale.html

- 言語、国およびバリアントのすべてのコードは、次のサイトにあるInternet Assigned Numbers Authority (IANA)の言語サブタグ・レジストリに関する項
http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry

5.10.2 文字列のOracle XQuery関数

Oracle XQueryの関数を使用して、XQueryで文字列を操作できます。

Oracle XQuery関数はhttp://xmlns.oracle.com/xdk/xquery/functionネームスペースにあります。ネームスペースの接頭辞ora-fnは事前に宣言され、モジュールは自動的にインポートされます。

- ora-fn:pad-left

- ora-fn:pad-right

- ora-fn:trim

- ora-fn:trim-left

- ora-fn:trim-right

5.10.2.1 ora-fn:pad-left

文字列の左側にパディング文字を追加して、固定長の文字列を作成します。入力文字列が指定のサイズを超えると、切り捨てられて指定の長さの部分文字列が返されます。デフォルトのパディング文字は空白(ASCII 32)です。

シグネチャ

ora-fn:pad-left($str as xs:string?,
$size as xs:integer?,
$pad as xs:string?)
as xs:string?

ora-fn:pad-left($str as xs:string?,
$size as xs:integer?)
as xs:string?

パラメータ

$str: 入力文字列

$size: 任意の固定長で、パディング文字を$strに追加することによってその長さにします。

$pad: パディング文字

いずれかの引数が空の順序の場合、関数は空の順序を返します。

例

この例は、入力文字列が最大長6文字になるまで"01"を先頭に追加します。返される文字列は"010abc"です。関数は、1つの完全なパッド文字、および1つの部分的なパッド文字を返します。

ora-fn:pad-left("abc", 6, "01")

この例は、入力文字列が指定の固定長を超えているため、"ab"のみを返します。

ora-fn:pad-left("abcd", 2, "01")

この例は、文字列が指定の最大長6文字になるまで空白を先頭に追加します。返される文字列は"abcd"で、先頭に2つの空白が含まれます。

ora-fn:pad-left("abcd", 6)

次の例は、入力文字列が指定の固定長を超えているため、"ab"のみを返します。

ora-fn:pad-left("abcd", 2)

5.10.2.2 ora-fn:pad-right

文字列の右側にパディング文字を追加して、固定長の文字列を作成します。入力文字列が指定のサイズを超えると、切り捨てられて指定の長さの部分文字列が返されます。デフォルトのパディング文字は空白(ASCII 32)です。

シグネチャ

ora-fn:pad-right($str as xs:string?,
$size as xs:integer?,
$pad as xs:string?)
as xs:string?

ora-fn:pad-right($str as xs:string?,
$size as xs:integer?)
as xs:string?

パラメータ

$str: 入力文字列

$size: 任意の固定長で、パディング文字を$strに追加することによってその長さにします。

$pad: パディング文字

いずれかの引数が空の順序の場合、関数は空の順序を返します。

例

この例は、入力文字列が最大長6文字になるまで"01"を追加します。返される文字列は"abc010"です。関数は、1つの完全なパッド文字、および1つの部分的なパッド文字を返します。

ora-fn:pad-right("abc", 6, "01")

この例は、入力文字列が指定の固定長を超えているため、"ab"のみを返します。

ora-fn:pad-right("abcd", 2, "01")

この例は、文字列が指定の最大長6文字になるまで空白を追加します。返される文字列は"abcd"で、末尾に2つの空白が含まれます。

ora-fn:pad-right("abcd", 6)

次の例は、入力文字列が指定の固定長を超えているため、"ab"のみを返します。

ora-fn:pad-right("abcd", 2)

5.10.2.3 ora-fn:trim

先頭または末尾の空白をすべて文字列から削除します。

シグネチャ

ora-fn:trim($input as xs:string?) as xs:string?

パラメータ

$input: 切捨て対象の文字列。$inputが空の順序の場合、関数は空の順序を返します。他のデータ型の場合はエラーが発生します。

例

この例は、文字列"abc"を返します。

ora-fn:trim("  abc  ")

5.10.2.4 ora-fn:trim-left

先頭の空白をすべて削除します。

シグネチャ

ora-fn:trim-left($input as xs:string?) as xs:string?

パラメータ

$input: 切捨て対象の文字列。$inputが空の順序の場合、関数は空の順序を返します。他のデータ型の場合はエラーが発生します。

例

この例は、先頭の空白を削除して、文字列"abc "を返します。

ora-fn:trim-left("    abc    ")

5.10.2.5 ora-fn:trim-right

末尾の空白をすべて削除します。

シグネチャ

ora-fn:trim-right($input as xs:string?) as xs:string?

パラメータ

$input: 切捨て対象の文字列。$inputが空の順序の場合、関数は空の順序を返します。他のデータ型の場合はエラーが発生します。

例

この例は、末尾の空白を削除して、文字列" abc"を返します。

ora-fn:trim-left("    abc    ")

5.11 Hadoop Module

これらの関数は、http://xmlns.oracle.com/hadoop/xqueryネームスペースにあります。oxh接頭辞は事前に宣言され、モジュールは自動的にインポートされます。

Hadoopモジュールについては、次のトピックを参照してください。

- Hadoop関数

5.11.1 Hadoopを使用するための組込み関数

Oracle XQuery for Hadoopには、次の関数が組み込まれています。

- oxh:find

- oxh:increment-counter

- oxh:println

- oxh:println-xml

- oxh:property

5.11.1.1 oxh:find

パターンに一致する一連のファイル・パスを返します。

シグネチャ

oxh:find($pattern as xs:string?) as xs:string*

パラメータ

$pattern: 検索するファイル・パターン

関連項目:

ファイル・パターンについては、次のサイトにある『Apache Hadoop API』のglobStatusメソッドに関する項

http://hadoop.apache.org/docs/current/api/org/apache/hadoop/fs/FileSystem.html#globStatus(org.apache.hadoop.fs.Path)

5.11.1.2 oxh:increment-counter

ユーザー定義のMapReduceジョブ・カウンタを増やします。デフォルトの増分は1です。

シグネチャ

oxh:increment-counter($groupName as xs:string, $counterName as xs:string, $value as xs:integer

oxh:increment-counter($groupName as xs:string, $counterName as xs:string

パラメータ

$groupName: このカウンタが属するカウンタ・グループ。

$counterName: ユーザー定義カウンタの名前

$value: カウンタを増やす量

5.11.1.3 oxh:println

Oracle XQuery for Hadoopクライアント・プロセスのstdoutにテキスト行を出力します。この関数は、問合せを開発しているときに使用します。

シグネチャ

declare %updating function oxh:println($arg as xs:anyAtomicType?)

パラメータ

$arg: 出力に追加する値です。cast操作は、最初にstringに変換します。空の順序は空の文字列と同じ方法で扱われます。

例

この例では、data.txtの値をstdoutに出力します。

for $i in text:collection("data.txt")
return oxh:println($i)

5.11.1.4 oxh:println-xml

テキスト行またはXMLをOracle XQuery for Hadoopクライアント・プロセスのstdoutに出力します。この関数は、問合せを開発しているとき、およびXMLドキュメントのノードを出力しているときに使用します。

シグネチャ

declare %updating function oxh:println-xml($arg as item()?)

パラメータ

$arg: 出力に追加する値です。入力項目は、XSLT 2.0仕様およびXQuery 1.0シリアライズ仕様の定義に従ってテキストに変換されます。空の順序は空の文字列と同じ方法で扱われます。

5.11.1.5 oxh:property

Hadoop構成プロパティの値を返します。

シグネチャ

oxh:property($name as xs:string?) as xs:string?

パラメータ

$name: 構成プロパティ

5.12 シリアライズ注釈

いくつかのアダプタにはシリアライズ注釈(%output:*)があります。次のリストに、Oracle XQuery for Hadoopがサポートするシリアライズ・パラメータを示します。

text出力方法に対してサポートされているシリアライズ・パラメータは次のとおりです。

- encoding: JVMでサポートされているエンコード

- normalization-form: none、NFC、NFD、NFKC、NFKD

xml出力方法に対してサポートされているシリアライズ・パラメータ(XQuery仕様で許可されている値を使用)は次のとおりです。

- cdata-section-elements

- doctype-public

- doctype-system

- encoding

- indent

- normalization-form

- omit-xml-declaration

- standalone

関連項目:

XMLおよびtext出力方法については、次のサイトにある『XSLT and XQuery Serialization』のシリアライズ・パラメータの影響に関する項

http://www.w3.org/TR/xslt-xquery-serialization/#XML_DOCTYPE

http://www.w3.org/TR/xslt-xquery-serialization/#XML_CDATA-SECTION-ELEMENTS

6 Oracle XML Extensions for Hive

この章では、Oracle XQuery for Hadoopで提供される、XML Extensions for Apache Hiveの使用方法について説明します。この章の内容は次のとおりです。

- XML Extensions for Hiveとは

- Hive拡張の使用

- Hive関数について

- XML表の作成

- Hive用のOracle XML関数のリファレンス

6.1 XML Extensions for Hiveとは

XML Extensions for Hiveでは、次のことを可能にするXML処理サポートが提供されています。

- HDFSの大規模なXMLファイルのHive表としての問合せ

- Hive表のXML文字列の問合せ

- Hadoop分散キャッシュのXMLファイル・リソースの問合せ

- 高負荷DOM解析を使用せずにXMLからアトミック値を効率的に抽出

- 複雑なXML要素の取得、生成および変換

- 単一XML値からの表の複数行の生成

- XMLでの欠落およびダーティ・データの管理

XML拡張では、次の各W3C最新標準もサポートされています。

- XQuery 1.0

- XQuery Update Facility 1.0 (変換式)

- XPath 2.0

- XML Schema 1.0

- XML Namespaces

XML拡張には2つのコンポーネントがあります。

- XML表を作成するためのXML InputFormatおよびSerDe
「XML表の作成」を参照してください。

- XML関数ライブラリ
「Hive関数について」を参照してください。

6.2 Hive拡張の使用

Oracle XQuery for Hadoop拡張を有効にするには、Hiveの起動時に--auxpathおよび-i引数を使用します。

$ hive --auxpath $OXH_HOME/hive/lib -i $OXH_HOME/hive/init.sql

注意:

--auxpath引数はHIVE_AUX_JARS_PATHの値を設定します。HIVE_AUX_JARS_PATHの値は単一のディレクトリまたはJARファイルのカンマ区切りリストのいずれかになります。Hive構成によってデフォルトでJARのリストにHIVE_AUX_JARS_PATHの値が設定されている場合、$OXH_HOME/hive/libにあるJARを個々にリストに追加する必要があります。つまり、リストにディレクトリを含めることはできません。ただし、Oracle BigDataLite VMでは、HIVE_AUX_JARS_PATHはHive拡張をデフォルトで含み、そのため--auxpathを指定する必要はありません。

拡張を初めて使用するとき、それらがアクセス可能であることを確認します。次の手順では、SRCという表を作成し、その表に1行ロードした後、xml_query関数を呼び出します。

拡張がアクセス可能であることを確認するには、次の手順を実行します。

1. 作業しようとしているHadoopクラスタにあるサーバーにログインします。

2. 1行を含むsrc.txtというテキスト・ファイルを作成します。

$ echo "XXX" > src.txt

3. Hiveコマンドライン・インタフェース(CLI)を起動します。

$ hive --auxpath $OXH_HOME/hive/lib -i $OXH_HOME/hive/init.sql

init.sqlファイルには、XML関数を宣言するCREATE TEMPORARY FUNCTION文が含まれています。

4. 簡単な表を作成します。

hive> CREATE TABLE src(dummy STRING);

SRC表は、SELECT構文の要件を満たすためにのみ必要です。これは、SQL関数をテストするためにSELECT文で参照される、Oracle DatabaseのDUAL表と同等です。

5. src.txtから表にデータをロードします。

hive> LOAD DATA LOCAL INPATH 'src.txt' OVERWRITE INTO TABLE src;

6. HiveのSELECT文を使用して表を問い合せます。

hive> SELECT * FROM src;
OK
xxx

7. Hive用のOracle XQuery for Hadoop関数を呼び出します。この例では、xml_query関数を呼び出してXML文字列を解析します。

hive> SELECT xml_query("x/y", "<x><y>123</y><z>456</z></x>") FROM src;
.
.
.
["123"]

拡張がアクセス可能な場合は、例に示すように、問合せで["123"]が返されます。

6.3 Hive関数について

Oracle XQuery for Hadoopの拡張を使用すると、Hadoop分散キャッシュのHive表およびXMLファイル・リソース内のXML文字列を問い合せることができます。これらは次の関数です。

- xml_query: 問合せの結果をSTRING値の配列として返します。

- xml_query_as_primitive: 問合せの結果をHiveプリミティブ値として返します。各Hiveプリミティブ・データ型には、それに対応する名前の個別の関数があります。

- xml_exists: 問合せの結果が空かどうかをテストします。

- xml_table: XML値をゼロ以上の表の行にマップします。この関数を使用すると、XMLのネストされた繰返し要素をHive表の行にマップできます。

「Hive用のOracle XML関数のリファレンス」を参照してください。

6.4 XML表の作成

この項では、HiveのCREATE TABLE文を使用して大規模なXMLドキュメントに関する表を作成する方法を説明します。

XML表に関するHive問合せは、MapReduceフレームワークでXMLを並列で処理できるようにOracle XQuery for HadoopによってXMLが分割されるため、適切な規模で行われます。

スケーラブルな処理をサポートし、MapReduceフレームワークで動作するために、表アダプタによって、表の行の作成に使用する要素がスキャンされます。表の一部であると識別した要素のみが解析され、残りのXMLは無視されます。したがって、XML表アダプタでは、入力XMLに制限が課される、XMLドキュメント全体の真の意味での解析は実行されません。これらの制限のため、「XQuery変換の要件」にリストされている制約を満たすXMLドキュメントに関してのみ表を作成できます。それ以外の場合は、エラーが発生するか、誤った結果となる場合があります。

6.4.1 XML表に対するHiveのCREATE TABLE構文

次に、XMLファイルに関するHive表を作成するためのHiveのCREATE TABLE文の基本構文を示します。

CREATE TABLE table_name (columns)
ROW FORMAT
SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe'
STORED AS
INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat'
OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat'
TBLPROPERTIES(configuration)

パラメータ

パラメータ

説明

columns

XML表の列タイプはすべて、「データ型変換」で示されているHiveプリミティブ・タイプの1つである必要があります。

configuration

「CREATE TABLE構成プロパティ」で説明されているいずれかのプロパティ。複数のプロパティはカンマで区切ります。

注意:

XML表へのデータの挿入はサポートされていません。

6.4.2 CREATE TABLE構成プロパティ

次の構成プロパティは、CREATE TABLEコマンドのconfigurationパラメータで使用します。

oxh-default-namespace

XML解析の表定義にある式のデフォルト・ネームスペースを設定します。値はURIです。

この例ではデフォルトのネームスペースを定義します。

"oxh-default-namespace" = "http://example.com/foo"

oxh-charset

XMLファイルの文字エンコードを指定します。サポートされているエンコードは、UTF-8 (デフォルト)、ISO-8859-1およびUS-ASCIIです。

表に対するXMLファイルはすべて、同じ文字エンコードを共有する必要があります。XMLファイルでのエンコード宣言は無視されます。

この例では、文字セットを定義します。

"oxh-charset" = "ISO-8859-1"

oxh-column.name

oxh-elementsプロパティで選択した要素を行の列にマップする方法を指定します。このプロパティ名では、nameを表の列の名前に置き換えます。値には任意のXQuery式を指定できます。式の初期コンテキスト項目("."変数)は、選択した要素にバインドされます。

問合せが正常に実行された場合でもログ・ファイルを確認してください。列式で値が返されない場合、または動的エラーが発生した場合、列値はNULLです。エラーが初めて発生したときは、エラーがログに記録され、問合せ処理は続行します。同じ列式で発生した後続のエラーはログに記録されません。

対応するoxh-columnプロパティがない表の列は、次のプロパティが指定されている場合と同様に動作します。

"oxh-column.name" = "(./name | ./@name)[1]"

したがって、デフォルトの動作では、表の列名と一致する最初の子要素または属性が選択されます。「構文の例」を参照してください。

oxh-elements

表の行にマップするXMLの要素の名前をカンマ区切りリストで示します。このプロパティは1回指定する必要があります。必須。

次の例では、XMLのfooという各要素をHive表の単一の行にマップします。

"oxh-elements" = "foo"

次の例では、XMLのfooまたはbarという各要素をHive表の行にマップします。

"oxh-elements" = "foo, bar"

oxh-entity.name

エンティティ参照定義のセットを定義します。

次の例では、XMLのエンティティ参照が、&foo;から"foo value"および&bar;から"bar value"に拡張されます。

"oxh-entity.foo" = "foo value"
"oxh-entity.bar" = "bar value"

oxh-namespace.prefix

ネームスペース・バインディングを定義します。

次の例では、接頭辞mynsをネームスペースhttp://example.orgにバインドします。

"oxh-namespace.myns" = "http://example.org"

このプロパティを複数回使用して、追加のネームスペースを定義できます。ネームスペース定義は、XMLの解析時に使用されます。oxh-elementおよびoxh-columnプロパティの値でそれらを参照することもできます。

次の例では、http://example.orgネームスペースのfoo要素のみが表の行にマップされます。

"oxh-namespace.myns" = "http://example.org",
"oxh-elements" = "myns:foo",
"oxh-column.bar" = "./myns:bar"

6.4.3 CREATE TABLEの例

この項で示す例は次のとおりです。

- 構文の例

- 簡単な例

- OpenStreetMapの例

6.4.3.1 構文の例

この例では、XML要素を列名にマップする方法を示します。

例6-1 基本的な列マッピング

次の表定義で、oxh-elementsプロパティは、XMLのfooという各要素が表の単一の行にマップされることを指定しています。oxh-columnプロパティは、BARというHive表の列では、STRINGに変換されたbarという子要素の値を取得し、ZIPという列では、INTに変換されたzipという子要素の値を取得することを指定しています。

CREATE TABLE example (bar STRING, zip INT)
ROW FORMAT
SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe'
STORED AS
INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat'
OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat'
TBLPROPERTIES(
"oxh-elements" = "foo",
"oxh-column.bar" = "./bar",
"oxh-column.zip" = "./zip"
)

例6-2 条件付き列マッピング

次のZIP列の変更された定義で、列は、foo要素に子のzip要素がない場合、またはzip要素に数値以外の値が含まれている場合は、-1の値を受け取ります。

"oxh-column.zip" = "
if (./zip castable as xs:int) then
xs:int(./zip)
else
-1
"

例6-3 デフォルトの列マッピング

次の2つの表定義は同等です。表定義2は、BAR列とZIP列のデフォルトのマッピングに基づいています。

表定義1

CREATE TABLE example (bar STRING, zip INT)
ROW FORMAT
SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe'
STORED AS
INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat'
OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat'
TBLPROPERTIES(
"oxh-elements" = "foo",
"oxh-column.bar" = "(./bar | ./@bar)[1]",
"oxh-column.zip" = "(./zip | ./@zip)[1]"
)

表定義2

CREATE TABLE example (bar STRING, zip INT)
ROW FORMAT
SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe'
STORED AS
INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat'
OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat'
TBLPROPERTIES(
"oxh-elements" = "foo"
)

6.4.3.2 簡単な例

これらの例は、架空のWebサイトのユーザーが送信したコメントを含む小規模なXMLドキュメントに関するHive表を作成する方法を示しています。ドキュメントの各comment要素には、ユーザーがそのコメントを気に入ったことを示す1つ以上のlike要素があります。

<comments>
<comment id="12345" user="john" text="It is raining :( "/>
<comment id="56789" user="kelly" text="I won the lottery!">
<like user="john"/>
<like user="mike"/>
</comment>
<comment id="54321" user="mike" text="Happy New Year!">
<like user="laura"/>
</comment>
</comments>

CREATE TABLEの例では、comments.xml入力ファイルは、ローカル・ファイル・システムの現在の作業ディレクトリにあります。

例6-4 表の作成

次のHiveのCREATE TABLEコマンドでは、COMMENTSというの表を作成します。ユーザー名、テキストおよびlikeの数が含まれる行が各コメントに対して1行あります。

hive>
CREATE TABLE comments (usr STRING, content STRING, likeCt INT)
ROW FORMAT
SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe'
STORED AS
INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat'
OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat'
TBLPROPERTIES(
"oxh-elements" = "comment",
"oxh-column.usr" = "./@user",
"oxh-column.content" = "./@text",
"oxh-column.likeCt" = "fn:count(./like)"
);

HiveのLOAD DATAコマンドで、comments.xmlをCOMMENTS表にロードします。ファイルの内容は、「簡単な例」を参照してください。

hive> LOAD DATA LOCAL INPATH 'comments.xml' OVERWRITE INTO TABLE comments;
]

次の問合せは、COMMENTS表の内容を示します。

hive> SELECT usr, content, likeCt FROM comments;
.
.
.
john  It is raining :(     0
kelly I won the lottery!   2
mike  Happy New Year!      1

例6-5 XML列の問合せ

このCREATE TABLEコマンドは例6-4と似ていますが、like要素がSTRING列にXMLとして生成される点が異なります。

hive>
CREATE TABLE comments2 (usr STRING, content STRING, likes STRING)
ROW FORMAT
SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe'
STORED AS
INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat'
OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat'
TBLPROPERTIES(
"oxh-elements" = "comment",
"oxh-column.usr" = "./@user",
"oxh-column.content" = "./@text",
"oxh-column.likes" = "fn:serialize(<likes>{./like}</likes>)"
);

HiveのLOAD DATAコマンドで、comments.xmlを表にロードします。ファイルの内容は、「簡単な例」を参照してください。

hive> LOAD DATA LOCAL INPATH 'comments.xml' OVERWRITE INTO TABLE comments2;

次の問合せは、COMMENTS2表の内容を示します。

hive> SELECT usr, content, likes FROM comments2;
.
.
.
john   It is raining :(    <likes/>
kelly  I won the lottery!  <likes><like user="john"/><like user="mike"/></likes>
mike   Happy New Year!     <likes><like user="laura"/></likes>

次の問合せでは、like要素からユーザー名を抽出します。

hive> SELECT usr, t.user FROM comments2 LATERAL VIEW
> xml_table("likes/like", comments2.likes, struct("./@user")) t AS user;
.
.
.
kelly  john
kelly  mike
mike   laura

例6-6 単一の文字列の列におけるXMLの生成

このコマンドでは、各コメントに対する行を含むCOMMENTS3という表を作成し、単一のSTRING列にXMLを生成します。

hive>
CREATE TABLE comments3 (xml STRING)
ROW FORMAT
SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe'
STORED AS
INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat'
OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat'
TBLPROPERTIES(
"oxh-elements" = "comment",
"oxh-column.xml" = "fn:serialize(.)"
);

HiveのLOAD DATAコマンドで、comments.xmlを表にロードします。ファイルの内容は、「簡単な例」を参照してください。

hive> LOAD DATA LOCAL INPATH 'comments.xml' OVERWRITE INTO TABLE comments3;

次の問合せは、XML列の内容を示します。

hive> SELECT xml FROM comments3;
.
.
.
<comment id="12345" user="john" text="It is raining :( "/>
<comment id="56789" user="kelly" text="I won the lottery!">
<like user="john"/>
<like user="mike"/>
</comment>
<comment id="54321" user="mike" text="Happy New Year!">
<like user="laura"/>
</comment>

次の問合せでは、IDを抽出してそれらを整数に変換します。

hive> SELECT xml_query_as_int("comment/@id", xml) FROM comments3;
.
.
.
12345
56789
54321

6.4.3.3 OpenStreetMapの例

次の各例では、全世界の無料の地図データを提供するOpenStreetMapからのデータを使用します。特定の地理的リージョンまたは地球全体のデータをXMLとしてエクスポートできます。OpenStreetMap XMLドキュメントには主に、一連のnode、wayおよびrelation要素が含まれています。

次の各例では、OpenStreetMap XMLファイルが/user/name/osm HDFSディレクトリに格納されます。

関連項目:

- OpenStreetMapデータをダウンロードするには、次のサイトを参照してください。
http://www.openstreetmap.org/export

- OpenStreetMap XML形式については、次のサイトを参照してください。
http://wiki.openstreetmap.org/wiki/OSM_XML

例6-7 OpenStreetMap XMLに関する表の作成

この例では、次のように各node要素に対する1行を含む、OpenStreetMap XMLに関する表を作成します。

- node要素のid、lat、lonおよびuser属性は、表の列にマップされます。

- 年がtimestamp属性から抽出され、YEAR列にマップされます。ノードにtimestamp属性がない場合、年には-1が使用されます。

- node要素に子のtag要素がある場合は、TAGS列にXML文字列として格納されます。nodeに子のtag要素がない場合、列値はNULLです。

hive>
CREATE EXTERNAL TABLE nodes (
id BIGINT,
latitude DOUBLE,
longitude DOUBLE,
year SMALLINT,
tags STRING
)
ROW FORMAT
SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe'
STORED AS
INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat'
OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat'
LOCATION '/user/name/osm'
TBLPROPERTIES (
"oxh-elements" = "node",
"oxh-column.id" = "./@id",
"oxh-column.latitude" = "./@lat",
"oxh-column.longitude" = "./@lon",
"oxh-column.year" = "
if (fn:exists(./@timestamp)) then
fn:year-from-dateTime(xs:dateTime(./@timestamp))
else
-1
",
"oxh-column.tags" = "
if (fn:exists(./tag)) then
fn:serialize(<tags>{./tag}</tags>)
else
()
"
);

次の問合せは、年ごとのノード数を返します。

hive> SELECT year, count(*) FROM nodes GROUP BY year;

次の問合せは、ノード全体の合計タグ数を返します。

hive> SELECT sum(xml_query_as_int("count(tags/tag)", tags)) FROM nodes;

例6-8

OpenStreetMap XMLでは、node、wayおよびrelation要素で、データに関与したユーザーなどの共通属性のセットが共有されます。次の表では、各node、wayおよびrelation要素に対して1行生成します。

hive>
CREATE EXTERNAL TABLE osm (
id BIGINT,
uid BIGINT,
type STRING
)
ROW FORMAT
SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe'
STORED AS
INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat'
OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat'
LOCATION '/user/name/osm'
TBLPROPERTIES (
"oxh-elements" = "node, way, relation",
"oxh-column.id" = "./@id",
"oxh-column.uid" = "./@uid",
"oxh-column.type" = "./name()"
);

次の問合せは、node、wayおよびrelation要素の数を返します。TYPE列は、選択した要素の名前であるnode、wayまたはrelationのいずれかに設定されます。

hive> SELECT type, count(*) FROM osm GROUP BY type;

次の問合せは、個別のユーザーIDの数を返します。

hive> SELECT count(*) FROM (SELECT uid FROM osm GROUP BY uid) t;

関連項目:

OpenStreetMapの要素および属性の説明は、次のサイトを参照してください。

http://wiki.openstreetmap.org/wiki/Elements

6.5 Hive用のOracle XML関数のリファレンス

この項では、Oracle XML Extensions for Hiveについて説明します。次のコマンドおよび関数について説明します。

- xml_exists

- xml_query

- xml_query_as_primitive

- xml_table

6.5.1 データ型変換

表6-1に、Hiveプリミティブ・タイプおよびXMLスキーマ・タイプ間で自動的に行われる変換を示します。

表6-1 同等のデータ型

Hive

XMLスキーマ

TINYINT

xs:byte

SMALLINT

xs:short

INT

xs:int

BIGINT

xs:long

BOOLEAN

xs:boolean

FLOAT

xs:float

DOUBLE

xs:double

STRING

xs:string

6.5.2 外部ファイルへのHiveアクセス

Hive関数は、次の外部ファイル・リソースにアクセスできます。

- XMLスキーマ
http://www.w3.org/TR/xquery/#id-schema-importを参照してください。

- XMLドキュメント
http://www.w3.org/TR/xpath-functions/#func-docを参照してください。

- XQueryライブラリ・モジュール
http://www.w3.org/TR/xquery/#id-module-importを参照してください。

これらのファイルは、HTTP (http://...構文を使用)またはローカル・ファイル・システム(file://...構文を使用)からそれらのURIによってアドレス指定できます。次の例では、タスクのローカル作業ディレクトリに対して相対的なファイルの場所が解決されるため、bar.xsdなどのURIを使用すると、分散キャッシュに追加されたファイルにアクセスできます。

xml_query("
import schema namespace tns='http://example.org' at 'bar.xsd';
validate { ... }
",
.
.
.

ローカル・ファイルにアクセスするには、最初に、HiveのADD FILEコマンドを使用してそのファイルをHadoop分散キャッシュに追加します。次に例を示します。

ADD FILE /local/mydir/thisfile.xsd;

それ以外の場合は、同じネットワーク・ドライブをマウントするか、ファイルをすべてのノードに単純にコピーするなど、クラスタのすべてのノードでファイルが使用できるようにする必要があります。デフォルトのベースURIは、ローカル作業ディレクトリに設定されます。

関連項目:

- 分散キャッシュへのアクセスの例は、xml_queryについては例6-15、xml_query_as_primitiveについては例6-22、xml_tableについては例6-31を参照してください。

- デフォルトのベースURIについては、次のサイトにある『XQuery 1.0:An XML Query Language』
http://www.w3.org/TR/xquery/#dt-base-uri

6.6 関数のオンライン・マニュアル

次のコマンドを使用して、Hive拡張関数のオンライン・ヘルプを取得できます。

DESCRIBE FUNCTION [EXTENDED] function_name;

次の例では、xml_query関数の簡単な説明が示されます。

hive> describe function xml_query;
OK
xml_query(query, bindings) - Returns the result of the query as a STRING array

EXTENDEDオプションを使用すると、詳細な説明と例が示されます。

hive> describe function extended xml_query;
OK
xml_query(query, bindings) - Returns the result of the query as a STRING array
Evaluates an XQuery expression with the specified bindings. The query argument must be a STRING and the bindings argument must be a STRING or a STRUCT. If the bindings argument is a STRING, it is parsed as XML and bound to the initial context item of the query. For example:

> SELECT xml_query("x/y", "<x><y>hello</y><z/><y>world</y></x>") FROM src LIMIT 1;
["hello", "world"]
.
.
.

6.7 xml_exists

問合せの結果が空かどうかをテストします。

シグネチャ

xml_exists(
STRING query,
{ STRING | STRUCT } bindings
) as BOOLEAN

説明

query

XQueryまたはXPath式。これは、関数が最初に評価されるときのみ読み込まれるため、定数値である必要があります。最初の問合せ文字列がコンパイルされ、後続のすべての呼出しで再使用されます。

Hadoop分散キャッシュおよびHTTPリソース(http://...)に格納されているファイルにアクセスできます。XMLドキュメントの場合はXQueryのfn:doc関数を使用し、プレーン・テキスト・ファイルにアクセスするにはfn:unparsed-textおよびfn:parsed-text-lines関数を使用します。

問合せのコンパイル中にエラーが発生した場合は、関数でエラーが発生します。問合せの評価中にエラーが発生した場合、エラーは(生成されずに)ログに記録され、空の配列が返されます。

bindings

問合せで処理される入力。値は、XML STRINGまたは変数値のSTRUCTです。

- STRING: 文字列は、問合せの初期コンテキスト項目にXMLとしてバインドされます。

- STRUCT: 偶数個のフィールドで構成されるSTRUCT。フィールドの各ペアで、問合せの変数バインディング(名前, 値)が定義されます。名前フィールドのタイプはSTRINGである必要があり、値フィールドにはサポートされているプリミティブを指定できます。「データ型変換」を参照してください。

戻り値

問合せの結果が空でない場合はtrue、結果が空または問合せで動的エラーが発生した場合はfalse。

注意

問合せで発生した最初の動的エラーはログに記録されますが、後続のエラーは記録されません。

例

例6-9 STRINGバインディング

次の例では、入力XML文字列を解析し、問合せx/yの初期コンテキスト項目にバインドします。

Hive> SELECT xml_exists("x/y", "<x><y>123</y></x>") FROM src LIMIT 1;
.
.
.
true

例6-10 STRUCTバインディング

次の例では、2つの問合せ変数$dataと$valueを定義します。

Hive> SELECT xml_exists(
"parse-xml($data)/x/y[@id = $value]",
struct(
"data", "<x><y id='1'/><y id='2'/></x>",
"value", 2
)
) FROM src LIMIT 1;
.
.
.
true

例6-11 エラー・ロギング

次の例では、入力XMLが無効であるため、エラーがログに書き込まれます。

hive> SELECT xml_exists("x/y", "<x><y>123</invalid></x>") FROM src LIMIT 1;
.
.
.
false

6.8 xml_query

問合せの結果をSTRING値の配列として返します。

シグネチャ

xml_query(
STRING query,
{ STRING | STRUCT } bindings
) as ARRAY<STRING>

説明

query

XQueryまたはXPath式。これは、関数が最初に評価されるときのみ読み込まれるため、定数値である必要があります。最初の問合せ文字列がコンパイルされ、後続のすべての呼出しで再使用されます。

Hadoop分散キャッシュおよびHTTPリソース(http://...)に格納されているファイルにアクセスできます。XMLドキュメントの場合はXQueryのfn:doc関数を使用し、プレーン・テキスト・ファイルにアクセスするにはfn:unparsed-textおよびfn:parsed-text-lines関数を使用します。例6-15を参照してください。

問合せのコンパイル中にエラーが発生した場合は、関数でエラーが発生します。問合せの評価中にエラーが発生した場合、エラーは(生成されずに)ログに記録され、空の配列が返されます。

bindings

問合せで処理される入力。値は、XML STRINGまたは変数値のSTRUCTです。

- STRING: 文字列は、問合せの初期コンテキスト項目にXMLとしてバインドされます。例6-12を参照してください。

- STRUCT: 偶数個のフィールドで構成されるSTRUCT。フィールドの各ペアで、問合せの変数バインディング(名前, 値)が定義されます。名前フィールドのタイプはSTRINGである必要があり、値フィールドにはサポートされているプリミティブを指定できます。「データ型変換」および例6-13を参照してください。

戻り値

STRING値のHive配列であり、一連のアトミック値に変換される問合せの結果です。問合せの結果が空の場合、戻り値は空の配列です。

例

例6-12 STRINGバインディングの使用

次の例では、入力XML文字列を解析し、問合せx/yの初期コンテキスト項目にバインドします。

hive>
SELECT xml_query("x/y", "<x><y>hello</y><z/><y>world</y></x>")
FROM src LIMIT 1;
.
.
.
["hello","world"]

例6-13 STRUCTバインディングの使用

次の例では、2番目の引数は、2つの問合せ変数$dataと$valueを定義するSTRUCTです。STRUCTの変数の値は、「データ型変換」で説明されているように、XMLスキーマ・タイプに変換されます。

hive>
SELECT xml_query(
"fn:parse-xml($data)/x/y[@id = $value]",
struct(
"data", "<x><y id='1'>hello</y><z/><y id='2'>world</y></x>",
"value", 1
)
) FROM src LIMIT 1;
.
.
.
["hello"]

例6-14 シリアライズされたXMLの取得

次の例では、fn:serialize関数を使用して、シリアライズされたXMLを返します。

hive>
SELECT xml_query(
"for $y in x/y
return fn:serialize($y)
",
"<x><y>hello</y><z/><y>world</y></x>"
) FROM src LIMIT 1;
.
.
.
["<y>hello</y>","<y>world</y>"]

例6-15 Hadoop分散キャッシュへのアクセス

次の例では、test.xmlという名前のファイルを分散キャッシュに追加し、fn:doc関数を使用してそれを問い合せます。ファイルには、次の値が格納されます。

<x><y>hello</y><z/><y>world</y></x>

hive> ADD FILE test.xml;
Added resource: test.xml
hive> SELECT xml_query("fn:doc('test.xml')/x/y", NULL) FROM src LIMIT 1;
.
.
.
["hello","world"]

例6-16 失敗した問合せの結果

次の例は、入力XMLが無効であるため、空の配列を返します。XML解析エラーがログに書き込まれます。

hive> SELECT xml_query("x/y", "<x><y>hello</y></invalid") FROM src LIMIT 1;
.
.
.
[]

6.9 xml_query_as_primitive

Hiveプリミティブ値として問合せの結果を返します。各Hiveプリミティブ・データ・タイプには、そのタイプに対応する名前の個別の関数があります。

- xml_query_as_string

- xml_query_as_boolean

- xml_query_as_tinyint

- xml_query_as_smallint

- xml_query_as_int

- xml_query_as_bigint

- xml_query_as_double

- xml_query_as_float

シグネチャ

xml_query_as_primitive (
STRING query,
{STRUCT | STRING} bindings,
} as primitive

説明

query

XQueryまたはXPath式。これは、関数が最初に評価されるときのみ読み込まれるため、定数値である必要があります。最初の問合せ文字列がコンパイルされ、後続のすべての呼出しで再使用されます。

Hadoop分散キャッシュおよびHTTPリソース(http://...)に格納されているファイルにアクセスできます。XMLドキュメントの場合はXQueryのfn:doc関数を使用し、プレーン・テキスト・ファイルにアクセスするにはfn:unparsed-textおよびfn:parsed-text-lines関数を使用します。例6-15を参照してください。

問合せのコンパイル中にエラーが発生した場合は、関数でエラーが発生します。問合せの評価中にエラーが発生した場合、エラーは(生成されずに)ログに記録され、空の配列が返されます。

bindings

問合せで処理される入力。値は、XML STRINGまたは変数値のSTRUCTです。

- STRING: 文字列は、問合せの初期コンテキスト項目にXMLとしてバインドされます。例6-17を参照してください。

- STRUCT: 偶数個のフィールドで構成されるSTRUCT。フィールドの各ペアで、問合せの変数バインディング(名前, 値)が定義されます。名前フィールドのタイプはSTRINGである必要があり、値フィールドにはサポートされているプリミティブを指定できます。「データ型変換」および例6-18を参照してください。
問合せの結果の最初の項目が、プリミティブ・タイプの関数にマップされるXMLスキーマ・タイプにキャストされます。問合せで複数の項目が返される場合、最初の項目以外はすべて無視されます。

戻り値

アトミック値に変換されたHiveプリミティブ値(問合せによって返される最初の項目)。問合せの結果が空の場合、戻り値はNULLです。

例

例6-17 STRINGバインディングの使用

次の例では、入力XML文字列を解析し、問合せx/yの初期コンテキスト項目にバインドします。

hive> SELECT xml_query_as_string("x/y", "<x><y>hello</y></x>") FROM src LIMIT 1;
.
.
.
"hello"

次は、他のプリミティブ関数を使用する文字列バインディングの例です。

hive> SELECT xml_query_as_int("x/y", "<x><y>123</y></x>") FROM src LIMIT 1;
.
.
.
123

hive> SELECT xml_query_as_double("x/y", "<x><y>12.3</y></x>") FROM src LIMIT 1;
.
.
.
12.3

hive> SELECT xml_query_as_boolean("x/y", "<x><y>true</y></x>") FROM src LIMIT 1;
.
.
.
true

例6-18 STRUCTバインディングの使用

次の例では、2番目の引数は、2つの問合せ変数$dataと$valueを定義するSTRUCTです。STRUCTの変数の値は、「データ型変換」で説明されているように、XMLスキーマ・タイプに変換されます。

hive>
SELECT xml_query_as_string(
"fn:parse-xml($data)/x/y[@id = $value]",
struct(
"data", "<x><y id='1'>hello</y><z/><y id='2'>world</y></x>",
"value", 2
)
) FROM src LIMIT 1;
.
.
.
world

例6-19 複数の問合せ結果を返す例

次の例は、問合せから最初の項目(hello)のみを返します。2番目の項目(world)は破棄されます。

hive> SELECT xml_query_as_string("x/y", "<x><y>hello</y><z/><y>world</y></x>") FROM src LIMIT 1;
.
.
.
hello

例6-20 空の問合せ結果を返す例

次の例は、問合せの結果が空であるためNULLを返します。

hive> SELECT xml_query_as_string("x/foo", "<x><y>hello</y><z/><y>world</y></x>") FROM src LIMIT 1;
.
.
.
NULL

例6-21 シリアライズされたXMLの取得

次の各例は、fn:serialize関数を使用して複雑なXML要素をSTRING値として返します。

hive> SELECT xml_query_as_string("fn:serialize(x/y[1])", "<x><y>hello</y><z/><y>world</y></x>") FROM src LIMIT 1;
.
.
.
"<y>hello</y>"

hive> SELECT xml_query_as_string(
"fn:serialize(<html><head><title>{$desc}</title></head><body>Name: {$name}</body></html>)",
struct(
"desc", "Employee Details",
"name", "John Doe"
)
) FROM src LIMIT 1;
...
<html><head><title>Employee Details</title></head><body>Name: John Doe</body></html>

例6-22 Hadoop分散キャッシュへのアクセス

次の例では、test.xmlという名前のファイルを分散キャッシュに追加し、fn:doc関数を使用してそれを問い合せます。ファイルには、次の値が格納されます。

<x><y>hello</y><z/><y>world</y></x>

Hive> ADD FILE test.xml;
Added resource: test.xml
Hive> SELECT xml_query_as_string("fn:doc('test.xml')/x/y[1]", NULL) FROM src LIMIT 1;
.
.
.
hello

例6-23 失敗した問合せの結果

次の例は、</invalidの山カッコがないためNULLを返します。XML解析エラーがログに書き込まれます。

Hive> SELECT xml_query_as_string("x/y", "<x><y>hello</invalid") FROM src LIMIT 1;
.
.
.
NULL

次の例は、fooをxs:floatとしてキャストできないためNULLを返します。キャスト・エラーがログに書き込まれます。

Hive> SELECT xml_query_as_float("x/y", "<x><y>foo</y></x>") FROM src LIMIT 1;
.
.
.
NULL

6.10 xml_table

XML値を表の1行以上の行にマップするか、または表の行にマップしないユーザー定義の表生成関数(UDTF)。この関数を使用すると、XMLのネストされた繰返し要素をHive表の行にマップできます。

シグネチャ

xml_table(
STRUCT? namespaces,
STRING query,
{STRUCT | STRING} bindings,
STRUCT? columns
)

説明

namespaces

問合せおよび列の式で使用できるネームスペースを指定します。オプション。

値は、偶数個のSTRINGフィールドで構成されるSTRUCTです。フィールドの各ペアで、問合せまたは列の式で使用されるネームスペース・バインディング(接頭辞, URI)が定義されます。例6-26を参照してください。

query

返される各値に対する表の行を生成するXQueryまたはXPath式。これは、関数が最初に評価されるときのみ読み込まれるため、定数値である必要があります。最初の問合せ文字列がコンパイルされ、後続のすべての呼出しで再使用されます。

問合せ処理時に動的エラーが発生した場合、関数でエラーは発生しませんが、最初はエラーがログに記録されます。後続の動的エラーはログに記録されません。

bindings

問合せで処理される入力。値は、XML STRINGまたは変数値のSTRUCTです。

- STRING: 文字列は、問合せの初期コンテキスト項目にXMLとしてバインドされます。例6-24を参照してください。

- STRUCT: 偶数個のフィールドで構成されるSTRUCT。フィールドの各ペアで、問合せの変数バインディング(名前, 値)が定義されます。名前フィールドのタイプはSTRINGである必要があり、値フィールドにはサポートされているプリミティブを指定できます。「データ型変換」を参照してください。

columns

生成される行の列を定義するXQueryまたはXPath式。オプション。

値は、追加のXQuery式を含むSTRUCTです。XQuery式は、関数が最初に評価されるときのみ読み込まれるため、定数のSTRING値である必要があります。STRUCTの各列式に対して、表に1つの列があります。

問合せで返される各項目に対して、式の初期コンテキスト項目として現在の項目で列式が評価されます。列式の結果はSTRING値に変換され、行の値になります。

列式の結果が空の場合、または列式の評価時に動的エラーが発生した場合、対応する列値はNULLです。列式で複数の項目が返される場合、最初の項目以外はすべて無視されます。

columns引数の省略は、'struct(".")'と指定することと同じです。例6-25を参照してください。

戻り値

query引数で返される各項目に対する1行の表の行。

注意

XML表アダプタを使用すると、HDFSの大規模なXMLファイルに関するHive表を作成できます。「XML表に対するHiveのCREATE TABLE構文」を参照してください。

例

注意:

xml_query_as_string関数を使用すると、この例で同じ結果を得ることができます。ただし、xml_tableは、単一の関数呼出しで3つの列値すべてを設定し、各行に対する入力XMLの解析が1回のみであるため、より効率的です。xml_query_as_string関数では、3つの列それぞれに対して別々の関数呼出しが必要であり、同じ入力XML値が毎回再解析されます。

例6-24 STRINGバインディングの使用

問合せ"x/y"は、2つの<y>要素を返すため、表の行が2行生成されます。2つの列式("./z", "./w")があるため、各行は2列です。

hive> SELECT xml_table(
"x/y",
"<x>
<y>
<z>a</z>
<w>b</w>
</y>
<y>
<z>c</z>
</y>
</x>
",
struct("./z", "./w")
) AS (z, w)
FROM src;
.
.
.
a        b
c        NULL

例6-25 columns引数の使用

次の2つの問合せは同等です。最初の問合せでは、columns引数の値が明示的に指定されています。

hive> SELECT xml_table(
"x/y",
"<x><y>hello</y><y>world</y></x>",
struct(".")
) AS (y)
FROM src;
.
.
.
hello
world

2番目の問合せではcolumns引数が省略されており、デフォルトでstruct(".")に設定されます。

hive> SELECT xml_table(
"x/y",
"<x><y>hello</y><y>world</y></x>"
) AS (y)
FROM src;
.
.
.
hello
world

例6-26 namespaces引数の使用

次の例では、ns接頭辞とURI http://example.orgを指定する、オプションのnamespaces引数を指定します。

hive> SELECT xml_table(
struct("ns", "http://example.org"),
"ns:x/ns:y",
"<x xmlns='http://example.org'><y><z/></y><y><z/><z/></y></x>",
struct("count(./ns:z)")
) AS (y)
FROM src;
.
.
.
1
2

例6-27 XMLドキュメントのHive表の問合せ

次の例では、タイプがSTRINGのXML_STRという単一の列がある、COMMENTS3表を問い合せます。次の3行が含まれています。

hive> SELECT xml_str FROM comments3;

<comment id="12345" user="john" text="It is raining:("/>
<comment id="56789" user="kelly" text="I won the lottery!"><like user="john"/><like user="mike"/></comment>
<comment id="54321" user="mike" text="Happy New Year!"><like user="laura"/></comment>

次の問合せは、COMMENTS3表からユーザー、テキストおよびlikeの数を抽出する方法を示しています。

hive> SELECT t.id, t.usr, t.likes
FROM comments3 LATERAL VIEW xml_table(
"comment",
comments.xml_str,
struct("./@id", "./@user", "fn:count(./like)")
) t AS id, usr, likes;

12345   john    0
56789   kelly   2
54321   mike    1

例6-28 ネストされたXML要素の表の行へのマッピング

次の例は、xml_tableを使用して、ネストされた繰返しXML要素を表の行にフラット化する方法を示しています。COMMENTS表は、例6-27を参照してください。

> SELECT t.i, t.u, t.l
FROM comments3 LATERAL VIEW xml_table (
"let $comment := ./comment
for $like in $comment/like
return
<r>
<id>{$comment/@id/data()}</id>
<user>{$comment/@user/data()}</user>
<like>{$like/@user/data()}</like>
</r>
",
comments.xml_str,
struct("./id", "./user", "./like")
) t AS i, u, l;

56789   kelly   john
56789   kelly   mike
54321   mike    laura

例6-29 オプションのネストされたXML要素の表の行へのマッピング

次の例は、例6-28を少し変更したもので、コメントにlikeがない場合でも行を生成します。COMMENTS表は、例6-27を参照してください。

> SELECT t.i, t.u, t.l
FROM comments3 LATERAL VIEW xml_table (
"let $comment := ./comment
for $like allowing empty in $comment/like
return
<r>
<id>{$comment/@id/data()}</id>
<user>{$comment/@user/data()}</user>
<like>{$like/@user/data()}</like>
</r>
",
comments.xml_str,
struct("./id", "./user", "./like")
) t AS i, u, l;

12345   john
56789   kelly   john
56789   kelly   mike
54321   mike    laura

例6-30 新規ビューの作成

表生成関数と同じxml_tableを使用して、ビューおよび新規の表を作成できます。次の例では、COMMENTS表からCOMMENTS_LIKESという新しいビューを作成します。

hive> CREATE VIEW comments_likes AS
SELECT xml_table(
"comment",
comments.xml_str,
struct("./@id", "count(./like)")
) AS (id, likeCt)
FROM comments;

次の例では、新しいビューを問い合せます。

> SELECT * FROM comments_likes
WHERE CAST(likeCt AS INT) != 0;

56789   2
54321   1

例6-31 Hadoop分散キャッシュへのアクセス

fn:docおよびfn:unparsed-text関数を使用して、分散キャッシュに追加されたXMLドキュメントとテキスト・ファイルにアクセスできます。

次の例では、次の文字列を含むtest.xmlというファイルを問い合せます。

<x><y>hello</y><z/><y>world</y></x>

hive> ADD FILE test.xml;
Added resource: test.xml
hive> SELECT xml_table("fn:doc('test.xml')/x/y", NULL) AS y FROM src;
.
.
.
hello
world

第IV部 Oracle R Advanced Analytics for Hadoop

この部には次の章が含まれます。

- Oracle R Advanced Analytics for Hadoopの使用

7 Oracle R Advanced Analytics for Hadoopの使用

この章では、ビッグ・データに対するRのサポートについて説明します。内容は次のとおりです。

- Oracle R Advanced Analytics for Hadoopについて

- HDFSファイルへのアクセス

- Apache Hiveへのアクセス

- Oracle Databaseへのアクセス

- Oracle R Advanced Analytics for Hadoop関数

- Oracle R Advanced Analytics for Hadoop関数のデモ

- Oracle R Advanced Analytics for Hadoopのセキュリティ上の注意

注意:

Oracle R Advanced Analytics for Hadoopの旧名称は、Oracle R Connector for Hadoop (ORCH)です。ORCHという表記は、下位互換性のためにこのドキュメントおよび製品で引き続き使用されています。

7.1 Oracle R Advanced Analytics for Hadoopについて

Oracle R Advanced Analytics for Hadoopには、次のものが用意されています。

- 汎用計算フレームワーク: このフレームワークでは、R言語を使用してカスタム・ロジックをマッパーまたはリデューサとして記述できます。コードは、Hadoopクラスタで使用可能な計算リソースとストレージ・リソースを使用する分散並列方式で実行されます。

- Hive表を操作するためのRインタフェース: これはOracle R Enterpriseの透過レイヤーと似ていますが、いくつかの機能が制限されています。

- パラレルに分散された事前パッケージ済のアルゴリズム・セット。

7.1.1 Oracle R Advanced Analytics for Hadoopアーキテクチャ

Oracle R Advanced Analytics for Hadoopの説明は次のとおりです。

- Hadoopディストリビューションの一部であるユーティリティHadoop Streaming上に構築され、任意の実行可能ファイルまたはスクリプトをマッパーまたはリデューサとするMapジョブまたはReduceジョブの作成および実行を可能にします。

- クライアント・サーバー構成でHadoopクラスタを使用するRユーザー用に設計されています。クライアント構成は、Oracle R Advanced Analytics for HadoopがデプロイされているHadoopディストリビューションの要件に従う必要があります。

- HDFSおよびHIVEがクライアント・ノードからHadoopクラスタに対して通信を行うためにコマンドライン・インタフェースを使用します。

- Rで記述されたユーザー提供のマッパー関数およびリデューサ関数によって簡単に処理できるように、データの入力ストリームをRデータ・フレーム・オブジェクトに変換するために必要なロジックを作成します。

- 移動するデータ・サイズおよびセキュリティ要件に応じてsqoopユーティリティまたはOracle Loader for Hadoopユーティリティを使用して、RユーザーがOracle Database表またはビューのデータをHDFSファイルとしてHadoopに移動できるようにします。同様に、HDFSファイルからOracle Databaseへデータを戻すこともできます。

- パフォーマンスを重視する分析ワークロードで、入力および出力でRのバイナリRData表現をサポートします。区切り表現とRData表現との間の変換ユーティリティはOracle R Advanced Analytics for Hadoopの一部として使用できます。

- 様々なHadoopディストリビューション間での類似性および違いを管理するHadoop Abstraction Layer (HAL)を含みます。ORCHは、起動時にHadoopバージョンを自動検出します。

7.1.2 Oracle R Advanced Analytics for Hadoopパッケージおよび関数

Oracle R Advanced Analytics for Hadoopには、Rパッケージのコレクションが組み込まれており、次の機能を提供します。

- 次の要素を使用するためのインタフェース:

- Apache Hive表

- Apache Hadoop計算インフラストラクチャ

- ローカルなR環境

- Oracle Database表

- 次の要素に対する予測分析手法:

- 線形回帰

- 一般化線形モデル

- ニューラル・ネットワーク

- 低ランクの行列因数分解モデルを使用した行列補完

- Non-Negative Matrix Factorization

- k-Meansクラスタリング

- 主要コンポーネント分析

- 多変量分析

これらの手法にはRインタフェースがありますが、Oracle R Advanced Analytics for Hadoopでは、このインタフェースをJavaまたはRで分散並列MapReduceジョブとして実装しているため、クラスタのすべてのノードを活用できます。

このパッケージは、他のRパッケージと同様にインストールしてロードします。簡単なR関数を使用して、次のようなタスクを実行できます。

- Hive対応透過層を使用したHDFSデータへのアクセスとデータの変換

- マッパーとリデューサを記述するためのR言語の使用

- Rメモリー、ローカル・ファイル・システム、HDFS、HiveおよびOracle Databaseインスタンスの間でデータをコピーします。

- RからHiveデータを透過的に操作します。

- Hadoop MapReduceジョブとしてRプログラムを実行し、それらの場所に結果を返します。

- Oracle R Advanced Analytics for Hadoopを使用すると、非クラスタ(ローカル)実行とHadoopクラスタ実行の両方で、MapReduceジョブをRから発行できます。

- Oracle R EnterpriseとOracle R Advanced Analytics for Hadoopをデータベース・サーバーで一緒に使用する場合、DBMS_SCHEDULERを使用して、ORCH関数を含むスクリプトを実行するようにデータベース・ジョブをスケジュールできます。

Oracle R Advanced Analytics for Hadoopを使用するには、MapReduceプログラミング、Rプログラミングおよび統計手法をよく理解しておく必要があります。

7.1.3 Oracle R Advanced Analytics for HadoopのAPI

Oracle R Advanced Analytics for Hadoopでは、次の接頭辞の関数を使用して、ローカルRクライアントからApache Hadoopへのアクセスを提供します。

- hadoop: Hadoop MapReduceへのインタフェースを提供する関数を特定します。

- hdfs: HDFSへのインタフェースを提供する関数を特定します。

- orch: 様々な関数を特定します。orchはORCH関数の一般的な接頭辞です。

- ore: Hiveデータストアへのインタフェースを提供する関数を特定します。

Oracle R Advanced Analytics for Hadoopは、主なオブジェクト・タイプとしてデータ・フレームを使用しますが、HDFSとのデータ交換を行うためにベクトルや行列でも機能できます。APIは、Rの数字、整数および文字のデータ型をサポートします。

APIのすべてがORCHライブラリに含まれます。関数については、「Oracle R Advanced Analytics for Hadoop関数」を参照してください。

関連項目:

RプロジェクトのWebサイト(http://www.r-project.org/)

7.1.4 Oracle R Advanced Analytics for Hadoopへの入力

Oracle R Advanced Analytics for Hadoopでは、HDFSディレクトリ、HIVE表、またはデータのバイナリRData表現に存在するデリミタ付きテキスト・ファイルを操作できます。Oracle R Advanced Analytics for Hadoopが編成するマップの少ない計算に対する入力データがHDFSに存在しない場合、計算を起動する前にデータのコピーがHDFSに自動的に作成されます。

Oracle R Advanced Analytics for Hadoopがデリミタ付きテキスト・ファイルを処理できるようにするには、そのファイルに関連付けられているメタデータを判別し、データ・ファイルとともに格納されているファイルのメタデータを取得します。ファイルは__ORCHMETA__という名前になります。メタデータには次のような情報が含まれています。

- ファイルにキーが含まれている場合は、キー区切りであるデリミタ

- 値区切りであるデリミタ

- ファイル内の列の番号および列のデータ型

- 列のオプションの名前

- 分類列のディクショナリ情報

- その他のOracle R Advanced Analytics for Hadoop固有のシステム・データ

Oracle R Advanced Analytics for Hadoopは、メタデータ・ファイルを作成するためにhdfs.attach()呼び出しの一部としてHDFSオブジェクトで自動メタデータ検出手順を実行します。HIVE表を操作するとき、__ORCHMETA__ファイルがHIVE表のdefinition2から自動的に作成されます。

Oracle R Advanced Analytics for Hadoopは、I/Oパフォーマンスのために、入力データをオプションでRのバイナリRData表現に変換できます。このI/Oパフォーマンスは純粋にJavaベースのマップ削減実装と同等になります。

Oracle R Advanced Analytics for HadoopはHDFSファイルから行ストリームを取得し、それらをデータ・フレーム・オブジェクト(または、RData表現が使用されている場合は、オプションでデータ・フレーム・オブジェクトから生成した、またはそのままのマトリックス・オブジェクト、ベクトル・オブジェクトまたはリスト・オブジェクト)としてフォーマットして、Rで記述されたマップ済関数に提供します。こうするためには、Oracle R Advanced Analytics for Hadoopは、データ・フレームの列になるトークン・タイプおよびデータ型を認識する必要があります。Oracle R Advanced Analytics for Hadoopは、Rの機能を使用して入力行ストリームのトークンを解析および解釈します。欠落した値がRの"NA"トークンを使用して表現されていない場合、hdfs.attach()のna.strings引数で明示的に識別できます。

同じキー区切りおよび値区切りのデリミタ付きテキスト・ファイルは、別のキー区切りおよび値区切りを持つファイルより優先されます。同じキー区切りおよび値区切りを持つファイルの読取りパフォーマンスは、異なるキー区切りおよび値区切りを持つファイルの約2倍の速さです。

キー区切りおよび値区切りは、hdfs.attach()のkey.sep引数およびval.sep引数を使用して指定するか、または出力HDFSデータ用のMapReduceジョブの実行時に指定できます。

バイナリRData表現は、Oracle R Advanced Analytics for Hadoopの入力データの最もパフォーマンス効率の高い表現です。可能であれば、パフォーマンスが重要な分析にはこのバイナリ・データ表現の使用をお薦めします。

7.2 HDFSファイルへのアクセス

HDFSに格納されるデータにOracle R Advanced Analytics for Hadoopがアクセスするには、入力ファイルが次の要件に従う必要があります。

- MapReduceジョブの入力ファイルはすべて、1つの論理ファイルの一環として1つのディレクトリに格納される必要があります。有効なHDFSディレクトリ名とファイル名の拡張子が受け入れられます。

- 該当ディレクトリ内の、アンダースコア(_)で始まる名前のファイルは無視されます。

デリミタはすべてサポートされており、キーと値のデリミタは異なってもかまいません。

また、最高のI/Oパフォーマンスを実現するために、RからのRdata表現を使用してデリミタ付きファイルをバイナリ形式に変換できます。

7.3 Apache Hiveへのアクセス

Apache Hiveは、HiveQLと呼ばれる問合せ言語(SQLとよく似ている)によって、代替のストレージおよび取得メカニズムをHDFSファイルに提供します。Hiveでは、分散処理にMapReduceが使用されます。ただし、データは構造化され、データ検出をサポートする追加のメタデータがあります。Oracle R Advanced Analytics for HadoopではHiveQLのデータ準備と分析機能が使用されますが、R言語構文も使用できます。

関連項目:

Apache HiveのWebサイト(http://hive.apache.org)

7.3.1 HiveのORCH関数

ORCHでは、次の変換関数を提供しており、HDFSとHive間のデータ移動が簡単にできます。

hdfs.toHive
hdfs.fromHive

7.3.2 HiveのORE関数

接頭辞にoreが付くR関数(ore.connectなど)を使用して、Hiveへ接続し、Hive表オブジェクトを分析および変換できます。Oracle R Enterpriseも使用している場合は、これらの関数を認識します。Oracle R Enterpriseのore関数は、Oracle Databaseでオブジェクトを作成して管理し、Oracle R Advanced Analytics for Hadoopのore関数は、Hiveデータベースでオブジェクトを作成して管理します。一度に1つのデータベース(HiveまたはOracle Databaseのいずれか)に接続できますが、同時に両方のデータベースに接続することはできません。

注意:

Oracle R Enterpriseを設定および使用するための要件と手順の詳細は、Oracle R Enterpriseライブラリ(http://docs.oracle.com/cd/E40980_01/)を参照してください。

たとえば、ore.connect(type="HIVE")は、デフォルトのHIVE database.ore.hiveOptions(dbname='dbtmp')との接続を確立し、デフォルト・データベースを変更できるようにします。一方、ore.showHiveOptions()は、現在のデフォルトのHIVEデータベースの検査を可能にします。

OREのas.ore.*関数とis.ore.*関数のリストは、表7-7を参照してください。

7.3.3 Hiveでサポートされる一般的なR関数

Oracle R Advanced Analytics for Hadoopは、次のメソッドを含む標準汎用R関数もオーバーロードしてHiveオブジェクトを操作します。

文字メソッド

casefold、chartr、gsub、nchar、substr、substring、tolower、toupper

このリリースでは、greplやsubはサポートされません。

フレーム・メソッド

- attach、show

- [、$、$<-、[[、[[<-

- サブセット関数: head、tail

- メタデータ関数: dim、length、NROW、nrow、NCOL、ncol、names、names<-、colnames、colnames<-

- 変換関数: as.data.frame、as.env、as.list

- 算術演算子: +、-、*、^、%%、%/%、/

- Compare、Logic、xor、!

- テスト関数: is.finite、is.infinite、is.na、is.nan

- 数学的変換: abs、acos、asin、atan、ceiling、cos、exp、expm1、floor、log、log10、log1p、log2、logb、round、sign、sin、sqrt、tan、trunc

- 基礎統計: colMeans、colSums、rowMeans、rowSums、Summary、summary、unique

- by、merge

- unlist、rbind、cbind、data.frame、eval

このリリースでは、dimnames、interaction、max.col、row.names、row.names<-、scale、split、subset、transform、withまたはwithinはサポートされません。

論理メソッド

ifelse、Logic、xor、!

行列メソッド

サポートされません。

数値メソッド

- 算術演算子: +、-、*、^、%%、%/%、/

- テスト関数: is.finite、is.infinite、is.nan

- abs、acos、asin、atan、ceiling、cos、exp、expm1、floor、log、log1p、log2、log10、logb、mean、round、sign、sin、sqrt、Summary、summary、tan、trunc、zapsmall

このリリースでは、atan2、besselI、besselK、besselJ、besselY、diff、factorial、lfactorial、pmax、pminまたはtabulateはサポートされません。

ベクトル・メソッド

- show、length、c

- テスト関数: is.vector、is.na

- 変換関数: as.vector、as.character、as.numeric、as.integer、as.logical

- [, [<-, |

- by、Compare、head、%in%、paste、sort、table、tail、tapply、unique

このリリースでは、interaction、lengthb、rankまたはsplitはサポートされません。

例7-1に、簡単なデータ準備とデータ処理を示します。詳細は、「Hiveデータ型のサポート」を参照してください。

例7-1 Rを使用したHive表のデータの処理

# Connect to Hive
ore.connect(type="HIVE")

# Attach the current envt. into search path of R
ore.attach()

# create a Hive table by pushing the numeric columns of the iris data set
IRIS_TABLE <- ore.push(iris[1:4])

# Create bins based on Petal Length
IRIS_TABLE$PetalBins = ifelse(IRIS_TABLE$Petal.Length < 2.0, "SMALL PETALS",
+                        ifelse(IRIS_TABLE$Petal.Length < 4.0, "MEDIUM PETALS",
+                        ifelse(IRIS_TABLE$Petal.Length < 6.0,
+                               "MEDIUM LARGE PETALS", "LARGE PETALS")))

#PetalBins is now a derived column of the HIVE object
> names(IRIS_TABLE)
[1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "PetalBins"

# Based on the bins, generate summary statistics for each group
aggregate(IRIS_TABLE$Petal.Length, by = list(PetalBins = IRIS_TABLE$PetalBins),
+           FUN = summary)
1        LARGE PETALS    6 6.025000 6.200000 6.354545 6.612500  6.9    0
2 MEDIUM LARGE PETALS    4 4.418750 4.820000 4.888462 5.275000  5.9    0
3       MEDIUM PETALS    3 3.262500 3.550000 3.581818 3.808333  3.9    0
4        SMALL PETALS    1 1.311538 1.407692 1.462000 1.507143  1.9    0
Warning message:
ORE object has no unique key - using random order

7.3.4 Hiveデータ型のサポート

Oracle R Advanced Analytics for Hadoopは、tinyint、smallint、bigint、int、floatおよびdoubleなどの文字列や数値のデータ型の列を含むHive表にアクセスできます。

次の複雑なデータ型はサポートされません。

array
binary
map
struct
timestamp
union

サポートされないデータ型を含むHive表にアクセスしようとすると、エラー・メッセージが表示されます。表にアクセスするには、サポートされるデータ型に列を変換する必要があります。

サポートされるデータ型への列の変換するには、次の手順を実行します。

1. Hiveコマンド・インタフェースを開きます。

$ hive
hive>

2. サポートされないデータ型の列を特定します。

hive> describe table_name;

3. 列のデータを表示します。

hive> select column_name from table_name;

4. サポートされるデータ型のみを使用して、変換されたデータの表を作成します。

5. 適切な変換ツールを使用して、データを新しい表にコピーします。

例7-2に配列の変換を示します。例7-3と例7-4に、タイムスタンプ・データの変換を示します。

例7-2 文字列の列への配列の変換

R> ore.sync(table="t1")
Warning message:
table t1 contains unsupported data types
.
.
.
hive> describe t1;
OK
col1   int
col2   array<string>

hive> select * from t1;
OK
1      ["a","b","c"]
2      ["d","e","f"]
3      ["g","h","i"]

hive> create table t2 (c1 string, c2 string, c2 string);
hive> insert into table t2 select col2[0], col2[1], col2[2] from t1;
.
.
.
R> ore.sync(table="t2")
R> ore.ls()
[1] "t2"
R> t2$c1
[1] "a" "d" "g"

例7-3では、timestampデータ型の文字列への自動変換が使用されます。データは、tstmpという列があるt5という表に格納されます。

例7-3 タイムスタンプ列の変換

hive> select * from t5;

hive> create table t6 (timestmp string);
hive> insert into table t6 SELECT tstmp from t5;

例7-4では、Hiveのget_json_object関数を使用して、JSON表からOracle R Advanced Analytics for Hadoopで使用する個別の表に、関連する2つの列を抽出します。

例7-4 JSONファイルのタイムスタンプ列の変換

hive> select * from t3;
OK
{"custId":1305981,"movieId":null,"genreId":null,"time":"2010-12-30:23:59:32","recommended":null,"activity":9}

hive> create table t4 (custid int, time string);

hive> insert into table t4 SELECT cast(get_json_object(c1, '$.custId') as int), cast(get_json_object(c1, '$.time') as string) from t3;

7.3.5 Hiveアクセスの使用上の注意

Hiveコマンド言語インタフェース(CLI)は問合せの実行に使用され、Linuxクライアントのサポートを提供します。JDBCやODBCはサポートされません。

ore.create関数は、Hive表をテキスト・ファイルのみで作成します。ただし、Oracle R Advanced Analytics for Hadoopは、テキスト・ファイルまたは順序ファイルのいずれかで格納されるHive表にアクセスできます。

ore.exec関数を使用して、RコンソールからHiveコマンドを実行できます。デモの場合、hive_sequencefileデモを実行します。

Oracle R Advanced Analytics for Hadoopは、デフォルトのHiveデータベースのみの表とビューにアクセスできます。他のデータベースのオブジェクトに対する読取りアクセス権を許可するには、デフォルトのデータベースでそのオブジェクトを公開する必要があります。たとえば、ビューを作成できます。

Oracle R Advanced Analytics for Hadoopには、Hiveでの順序付けの概念がありません。Hiveで存続するRフレームがHiveから抜け出してメモリーに入ると、そのフレームの順序は同じになりません。Oracle R Advanced Analytics for Hadoopは、順序付けが重要ではない大規模なHDFSデータセットのデータのクリーン・アップとフィルタ処理のサポートを主な目的として設計されています。順序付けられていないHiveフレームを操作する場合、次の警告メッセージが表示されます。

Warning messages:
1: ORE object has no unique key - using random order
2: ORE object has no unique key - using random order

これらの警告を抑制するには、次のようにRセッションでore.warn.orderオプションを設定します。

R> options(ore.warn.order = FALSE)

7.3.6 例: Oracle R Advanced Analytics for HadoopへのHive表のロード

例7-5に、分析目的でRデータ・フレームにHive表をロードする例を示します。次のOracle R Advanced Analytics for Hadoop関数が使用されます。

hdfs.attach
ore.attach
ore.connect
ore.create
ore.hiveOptions
ore.sync

例7-5 Hive表のロード

# Connect to HIVE metastore and sync the HIVE input table into the R session.
ore.connect(type="HIVE")
ore.sync(table="datatab")
ore.attach()

# The "datatab" object is a Hive table with columns named custid, movieid, activity, and rating.
# Perform filtering to remove missing (NA) values from custid and movieid columns
# Project out three columns: custid, movieid and rating
t1 <- datatab[!is.na(datatab$custid) &
!is.na(datatab$movieid) &
datatab$activity==1, c("custid","movieid", "rating")]

# Set HIVE field delimiters to ','. By default, it is Ctrl+a for text files but
# ORCH 2.0 supports only ',' as a file separator.
ore.hiveOptions(delim=',')

# Create another Hive table called "datatab1" after the transformations above.
ore.create (t1, table="datatab1")

# Use the HDFS directory, where the table data for datatab1 is stored, to attach
# it to ORCH framework. By default, this location is "/user/hive/warehouse"
dfs.id <- hdfs.attach("/user/hive/warehouse/datatab1")

# dfs.id can now be used with all hdfs.*, orch.* and hadoop.* APIs of ORCH for further processing and analytics.

7.4 Oracle Databaseへのアクセス

Oracle R Advanced Analytics for Hadoopは、基本レベルのデータベース・アクセスを提供します。データベース表の内容をHDFSに移動したり、HDFS分析の結果をデータベースに戻したりすることができます。

その後、Oracle R Enterpriseという個別の製品を使用して、この小規模データセットに対してさらに分析を実行できます。この製品を使用すると、R言語を使用して、データベースの表、ビューおよびその他のデータ・オブジェクトに統計分析を実行できます。Business Intelligenceおよびインデータベース分析のサポートを含む、データベース・オブジェクトへの透過的なアクセス権があります。

Oracle Databaseに格納されるデータへのアクセスは、常にDBAから付与されるアクセス権に制限されます。

Oracle R Enterpriseは、Oracle Database Enterprise EditionへのOracle Database Advanced Analyticsオプションに含まれています。Oracle Big Data Connectorsには含まれていません。

関連項目:

Oracle R Enterpriseユーザーズ・ガイド

7.4.1 Oracle Databaseアクセスの使用上の注意

Oracle R Advanced Analytics for Hadoopは、Sqoopを使用して、HDFSとOracle Database間でデータを移動します。Sqoopは、Oracle R Advanced Analytics for Hadoopに対して次のような複数の制限を設けます。

- BINARY_FLOAT列またはBINARY_DOUBLE列を含むOracle表はインポートできません。回避策として、これらの列の型をNUMBERデータ型に変換するビューを作成できます。

- 列名はすべて大文字にする必要があります。

7.4.2 Oracle R EnterpriseでOracle R Advanced Analytics for Hadoopを使用する場合のシナリオ

次のシナリオで、Oracle R Advanced Analytics for HadoopとOracle R Enterpriseを使用するケースを確認してください。

Oracle R Advanced Analytics for Hadoopを使用すると、アクセス権を持つファイルをHDFS上で検索して、そのうち1つのファイルのデータに対してR計算を実行できます。また、ローカル・ファイル・システムのテキスト・ファイルに格納されているデータを計算用にHDFSにアップロードし、DBMS_SCHEDULERを使用してRスクリプトをHadoopクラスタで実行するようスケジュールして、結果をローカル・ファイルにダウンロードできます。

Oracle R Enterpriseを使用すると、Rインタフェースを開いてOracle Databaseに接続し、データベースの権限に基づいて使用可能になる表とビューを操作できます。行の除外、導出された列の追加、新しい列の投影および視覚的で統計的な分析を行うことができます。

Oracle R Advanced Analytics for Hadoopを使用すると、Rで記述されたCPU負荷の高い計算の場合、MapReduceジョブをHadoopにデプロイできます。計算には、HDFS (Oracle R Enterpriseを含む)またはOracle Databaseに格納されているデータを使用できます。計算の結果をOracle DatabaseやRコンソールに返し、視覚化したり、追加処理を行うことができます。

7.5 Oracle R Advanced Analytics for Hadoop関数

Oracle R Advanced Analytics for Hadoop関数の説明は、Rヘルプ・トピックを参照してください。この項では、各関数を機能カテゴリに分類し、簡単に説明します。

- ネイティブ分析関数

- Hadoop Distributed File System (HDFS)の使用

- Apache Hiveの使用

- Hiveでの集計関数の使用

- データベース接続の確立

- データのコピーおよびHDFSファイルの操作

- Rデータ型への変換

- MapReduceの使用

- スクリプトのデバッグ

7.5.1 ネイティブ分析関数

表7-1にネイティブ分析関数を示します。

表7-1 統計分析用の関数

関数

説明

orch.cor

Pearsonの相関係数の相関行列を生成します。

orch.cov

共分散行列を生成します。

orch.getXlevels

model.matrix呼出しのxlev引数で使用できる因数レベルのリストを作成します。統計パッケージの.getXlevels関数と同等です。

orch.glm

HDFSに格納されているデータに対して、汎用線形モデルを適合させて使用します。

orch.kmeans

HDFSにファイルとして格納されているデータ行列に対してK平均法クラスタリングを実行します。

orch.lm

tall-and-skinny QR (TSQR)因数分解と並列分散を使用して線形モデルを調整します。この関数は、 Oracle R Enterpriseのore.lm関数と同じ統計パラメータを計算します。

orch.lmf

jellyfishアルゴリズム、またはMahout alternating least squares with weighted regularization (ALS-WR)アルゴリズムを使用して、低ランクの行列因数分解モデルを調整します。

orch.neural

入力と出力の間の複雑な非線形の関係をモデル化したり、データのパターンを見つけたりするニューラル・ネットワークを提供します。

orch.nmf

jellyfishアルゴリズムを使用して非負行列因子分解モデルを作成する主なエントリ・ポイントを提供します。この関数は、入力をメモリーに収める必要がないため、RのNMFパッケージよりもかなり大規模なデータセットを操作できます。

orch.nmf.NMFalgo

RのNMFパッケージ・フレームワークをカスタム・アルゴリズムとして挿入します。この関数は、ベンチマーク・テストに使用されます。

orch.princomp

主コンポーネントのパフォーマンスを分析します。

orch.recommend

入力したorch.mahout.lmf.aslモデルに基づき、格付けが予想される各ユーザーに推奨される上位n個の項目を計算します。

orch.sample

貯蔵サンプリングを提供します。

orch.scale

スケーリングを実行します。

7.5.2 Hadoop Distributed File System (HDFS)の使用

表7-2で、R環境内からHDFSコマンドを実行する関数について説明します。

表7-2 HDFSを使用するための関数

関数

説明

hdfs.cd

デフォルトのHDFSパスを設定します。

hdfs.cp

HDFSファイルを別の場所にコピーします。

hdfs.describe

HDFS内のファイルに関連付けられたメタデータを返します。

hdfs.exists

ファイルがHDFSに存在することを確認します。

hdfs.head

HDFS内のファイルの先頭から、指定した数の行をコピーします。

hdfs.id

HDFSパス名をRのdfs.idオブジェクトに変換します。

hdfs.ls

指定されたパス内のデータを含む全HDFSディレクトリの名前のリスト。

hdfs.mkdir

現在の作業ディレクトリに相対的なサブディレクトリをHDFS内に作成します。

hdfs.mv

HDFSファイルを別の場所に移動します。

hdfs.parts

HDFS内のファイルを構成する部分の数を返します。

hdfs.pwd

HDFS内の現在の作業ディレクトリを識別します。

hdfs.rm

HDFSからファイルまたはディレクトリを削除します。

hdfs.rmdir

HDFS内のディレクトリを削除します。

hdfs.root

HDFSのrootディレクトリを返します。

hdfs.setroot

HDFSのrootディレクトリを設定します。

hdfs.size

HDFS内のファイルのサイズを返します。

hdfs.tail

HDFS内のファイルの末尾から、指定された数の行をコピーします。

7.5.3 Apache Hiveの使用

表7-3で、Hiveとともに使用するためにOracle R Advanced Analytics for Hadoopで使用可能な関数について説明します。「HiveのORE関数」を参照してください。

表7-3 Hiveを使用するための関数

関数

説明

hdfs.fromHive

ORCHでHive表をHDFS識別子に変換します。

hdfs.toHive

HDFSオブジェクト識別子をore.frameオブジェクトで表されるHive表に変換します。

ore.create

data.frameオブジェクトまたはore.frameオブジェクトからデータベース表を作成します。

ore.drop

データベース表またはビューを削除します。

ore.get

指定されたore.frameオブジェクトを取得します。

ore.pull

Hive表からRオブジェクトにデータをコピーします。

ore.push

RオブジェクトからHive表にデータをコピーします。

ore.recode

ore.vectorオブジェクトの値を置換します。

7.5.4 Hiveでの集計関数の使用

表7-4で、Hiveとともに使用するためにOracle R Advanced Analytics for HadoopでサポートされるOREstatsパッケージの集計関数について説明します。

表7-4 Oracle R Enterprise集計関数

関数

説明

aggregate

データをサブセットに分割し、サブセットごとに統計サマリーを計算します。

fivenum

入力データのTukeyの5数要約(最小値、下側ヒンジ、中央値、上側ヒンジ、最大値)を返します。

IQR

四分位範囲を計算します。

median

サンプル中央値を計算します。

quantile

指定された蓋然率に対応するサンプル変位値を生成します。

sd

標準偏差を計算します。

var[1]

差異を計算します。

7.5.5 データベース接続の確立

表7-5で、Oracle Databaseへの接続を確立するための関数について説明します。

表7-5 Oracle Databaseを使用するための関数

関数

説明

orch.connect

Oracle Databaseへの接続を確立します。

orch.connected

Oracle R Advanced Analytics for HadoopがOracle Databaseに接続するかどうかを確認します。

orch.dbcon

認証資格証明を除く、Oracle Databaseへの現在の接続の接続オブジェクトを返します。

orch.dbinfo

現在の接続に関する情報を表示します。

orch.disconnect

ローカルRセッションをOracle Databaseから切断します。

orch.reconnect

orch.disconnectで以前に返された資格証明を使用してOracle Databaseに再接続します。

7.5.6 データのコピーおよびHDFSファイルの操作

表7-6で、OracleデータベースのRデータ・フレーム、HDFSファイル、ローカル・ファイルおよび表を含め、プラットフォーム間でデータをコピーするための関数について説明します。

表7-6 データをコピーするための関数

関数

説明

hdfs.attach

HDFSの非構造化データ・ファイルのデータを、Rフレームワークにコピーします。デフォルトでは、HDFSのデータ・ファイルはコネクタで表示されません。ただし、データ・ファイルの名前がわかっている場合、この関数を使用して名前をOracle R Advanced Analytics for Hadoopネームスペースにアタッチします。

hdfs.download

HDFSからローカル・ファイル・システムにファイルをコピーします。

hdfs.get

HDFSからローカルR環境のデータ・フレームにデータをコピーします。R環境でデータが生成されると、すべてのメタデータが抽出され、列名やデータ型などのすべての属性がリストアされます。R環境でデータが生成されない場合、val1やval2などの汎用属性が割り当てられます。

hdfs.pull

HDFSからOracle Databaseにデータをコピーします。この操作は、Oracle Databaseによる認証が必要です。orch.connectを参照してください。

hdfs.push

Oracle DatabaseからHDFSにデータをコピーします。この操作は、Oracle Databaseによる認証が必要です。orch.connectを参照してください。

hdfs.put

Rのインメモリー・オブジェクト(data.frame)からHDFSにデータをコピーします。列名やデータ型などのすべてのデータ属性が、データとともにメタデータとして格納されます。

hdfs.sample

HadoopファイルからRインメモリー・オブジェクトにデータのランダム・サンプルをコピーします。この関数を使用して、最終的にはHadoopクラスタ上のHDFSデータセット全体で実行するR計算の開発用に、元のHDFSデータの小規模なサンプルをコピーします。

hdfs.upload

ローカル・ファイル・システムからHDFSにファイルをコピーします。

is.hdfs.id

Rオブジェクトに有効なHDFSファイル識別子が含まれるかどうかを示します。

7.5.7 Rデータ型への変換

表7-7で、データ型の変換およびテスト用の関数について説明します。Oracle R EnterpriseのOREbaseパッケージには、次の関数が用意されています。

表7-7 データ型の変換およびテスト用の関数

関数

説明

as.ore

インメモリーRオブジェクトをOREオブジェクトにします。

as.ore.character

インメモリーRオブジェクトをORE文字オブジェクトにします。

as.ore.date

インメモリーRオブジェクトをORE日付オブジェクトにします。

as.ore.datetime

インメモリーRオブジェクトをORE日時オブジェクトにします。

as.ore.difftime

インメモリーRオブジェクトをORE時間差オブジェクトにします。

as.ore.factor

インメモリーRオブジェクトをORE因数オブジェクトにします。

as.ore.frame

インメモリーRオブジェクトをOREフレーム・オブジェクトにします。

as.ore.integer

インメモリーRオブジェクトをORE整数オブジェクトにします。

as.ore.list

インメモリーRオブジェクトをOREリスト・オブジェクトにします。

as.ore.logical

インメモリーRオブジェクトをORE論理オブジェクトにします。

as.ore.matrix

インメモリーRオブジェクトをORE行列オブジェクトにします。

as.ore.numeric

インメモリーRオブジェクトをORE数値オブジェクトにします。

as.ore.object

インメモリーRオブジェクトをOREオブジェクトにします。

as.ore.vector

インメモリーRオブジェクトをOREベクトル・オブジェクトにします。

is.ore

指定された値が特定のOracle R Enterpriseクラスのオブジェクトかどうかをテストします。

is.ore.character

指定された値が文字かどうかをテストします。

is.ore.date

指定された値が日付かどうかをテストします。

is.ore.datetime

指定された値が日時型かどうかをテストします。

is.ore.difftime

指定された値が時間差型かどうかをテストします。

is.ore.factor

指定された値が因数かどうかをテストします。

is.ore.frame

指定された値がフレームかどうかをテストします。

is.ore.integer

指定された値が整数かどうかをテストします。

is.ore.list

指定された値がリストかどうかをテストします。

is.ore.logical

指定された値が論理型かどうかをテストします。

is.ore.matrix

指定された値が行列かどうかをテストします。

is.ore.numeric

指定された値が数値かどうかをテストします。

is.ore.object

指定された値がオブジェクトかどうかをテストします。

is.ore.vector

指定された値がベクトルかどうかをテストします。

7.5.8 MapReduceの使用

表7-8で、MapReduceプログラムの作成時や実行時に使用する関数について説明します。

表7-8 MapReduceを使用するための関数

関数

説明

hadoop.exec

Hadoopエンジンを起動し、実行用にマッパー、リデューサおよびコンバイナR関数を送信します。まず、データをHDFSにロードする必要があります。

hadoop.jobs

実行中のジョブをリストするため、Hadoopクラスタでの現在の負荷を評価できます。

hadoop.run

Hadoopエンジンを起動し、実行用にマッパー、リデューサおよびコンバイナR関数を送信します。データがまだHDFSに格納されていない場合、hadoop.runは、まずデータをHDFSにコピーします。

orch.dryrun

ローカル・ホストとHadoopクラスタ間で実行プラットフォームを切り替えます。ドライ・ランにRコードの変更は必要ありません。

orch.export

ユーザーのローカルRセッションのRオブジェクトをHadoop実行環境で利用できるようにするため、これらのオブジェクトをMapReduceジョブで参照できます。

orch.keyval

MapReduceジョブのキーと値のペアを出力します。

orch.keyvals

MapReduceジョブのキーと値の一連のペアを出力します。

orch.pack

マッパーまたはリデューサがキーと値のペアの値として記述する必要がある、1つ以上のインメモリーRオブジェクトを圧縮します。

orch.tempPath

一時データが格納されるパスを設定します。

orch.unpack

前述のorch.packの呼出しで圧縮されたRオブジェクトをリストアします。

orch.create.parttab

パーティション化Hive表をORCH MapReduceフレームワークとともに使用できるようにします。

7.5.9 スクリプトのデバッグ

表7-9に、Rプログラム・スクリプトのデバッグの支援に使用できる関数を示します。

表7-9 スクリプトのデバッグ用の関数

関数

説明

orch.dbg.lasterr

最後のエラー・メッセージを返します。

orch.dbg.off

デバッグ・モードを無効にします。

orch.dbg.on

デバッグ・モードを有効にします。これにより、Rコマンドを含むHadoopとOracle R Advanced Analytics for Hadoopとの間のやりとりを出力します。

orch.dbg.output

デバッガからの出力を管理します。

orch.version

ORCHパッケージのバージョンを識別します。

orch.debug

MapReduce RスクリプトのR形式のデバッグを可能にします。

7.6 Oracle R Advanced Analytics for Hadoop関数のデモ

Oracle R Advanced Analytics for Hadoopには、様々なデモが用意されており、他のRデモと同じ方法でアクセスできます。

demo関数により、ORCHで使用可能な関数がリストされます。

R>  demo(package="ORCH")
Demos in package 'ORCH':

hdfs_cpmv               ORCH's copy and move APIs
hdfs_datatrans          ORCH's HDFS data transfer APIs
hdfs_dir                ORCH's HDFS directory manipulation APIs
hdfs_putget             ORCH's get and put API usage
hive_aggregate          Aggregation in HIVE
hive_analysis           Basic analysis & data processing operations
hive_basic              Basic connectivity to HIVE storage
hive_binning            Binning logic
hive_columnfns          Column function
hive_nulls              Handling of NULL in SQL vs. NA in R
.
.
.

このリストからデモを実行するには、次の構文を使用します。

demo("demo_name", package="ORCH")

たとえば、このパッケージは、Hive binningのデモを実行します。

R> demo("hive_binning", package = "ORCH")

demo('hive_binning', package = 'ORCH')

demo(hive_binning)
---- ~~~~~~~~~~~~

> #
> #     ORACLE R CONNECTOR FOR HADOOP DEMOS
> #
> #     Name: hive_binning.R
> #     Description: Demonstrates binning logic in R
> #
> #
.
.
.

エラーが発生した場合は、作業領域イメージを保存せずにRを終了し、新しいセッションを開始してください。また、ローカル・ファイル・システムおよびHDFSファイル・システムに作成された一時ファイルを削除する必要もあります。

# rm -r /tmp/orch*
# hdfs dfs -rm -r /tmp/orch*

完了したら、次のようにします。

1. hadoop.execを実行して、すべての空のpartファイルおよびHadoopログ・ファイルをクリーン・アップまたは削除します。

2. hadoop.runを実行して、同じ名前でのHDFSオブジェクトの上書きを許可します。

7.7 Oracle R Advanced Analytics for Hadoopのセキュリティ上の注意

Oracle R Advanced Analytics for Hadoopでは、Sqoopユーティリティを起動してOracle Databaseに接続し、データの抽出または結果の格納を実行します。

Sqoopは、HDFSまたはHiveと構造化データベースとの間でデータのインポートとエクスポートを行うHadoopのコマンドライン・ユーティリティです。Sqoopという名前は、"SQL to Hadoop"に由来します。Oracle R Advanced Analytics for Hadoopでのデータベース・ユーザー・パスワードの格納方法とSqoopへの送信方法について、次に説明します。

Oracle R Advanced Analytics for Hadoopでは、毎回パスワードを再入力する必要のないモードでユーザーがデータベース接続を確立した場合にのみユーザー・パスワードを格納します。パスワードは暗号化されてメモリーに格納されます。orch.connectについては、ヘルプ・トピックを参照してください。

Oracle R Advanced Analytics for Hadoopでは、Sqoop用の構成ファイルを生成し、Sqoopのローカルでの起動に使用します。ファイルには、ユーザーへの要求または暗号化されたインメモリー表現から取得されたユーザーのデータベース・パスワードが含まれます。ファイルは、ローカル・ユーザー・アクセス権限のみ持ちます。ファイルが作成され、権限が明示的に設定された後、ファイルが書込み用に開かれ、データが挿入されます。

Sqoopでは、構成ファイルを使用して特定のデータベース・ジョブ用にカスタムJARファイルを動的に生成し、JARファイルをHadoopクライアント・ソフトウェアに渡します。パスワードは、コンパイルされたJARファイル内に格納されます。プレーン・テキストには格納されません。

JARファイルは、ネットワーク接続を介してHadoopクラスタに転送されます。ネットワーク接続と転送プロトコルは、Hadoopに固有です(ポート5900など)。

構成ファイルは、SqoopでJARファイルのコンパイルが終了し、Hadoopジョブが起動されたら、削除されます。

[1]
ベクトルの場合のみ

索引

A B C D E F G H I J K L M N O P Q R S T U V W X

記号

- %*

- put注釈 1

- %注釈 1 , 2 , 3

- %ora-java

- binding注釈 1

- %output注釈 1

- %output:encoding注釈 1

- %output:media-type注釈 1

- %updating注釈 1

A

- アクセス権限, Oracle Database 1

- アダプタ

- Avro 1

- Oracle NoSQL Database 1

- 順序ファイル 1

- テキスト・ファイル 1

- Tika 1

- XMLファイル 1

- Hiveの集計関数 1

- ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTERプロパティ 1

- ALLOW_COMMENTSプロパティ 1

- ALLOW_NON_NUMERIC_NUMBERSプロパティ 1

- ALLOW_NUMERIC_LEADING_ZEROSプロパティ 1

- ALLOW_SINGLE_QUOTESプロパティ 1

- ALLOW_UNQUOTED_CONTROL_CHARSプロパティ 1

- ALLOW_UNQUOTED_FIELD_NAMESプロパティ 1

- ALTER SESSIONコマンド 1

- Rでの分析関数 1

- analyze-string関数 1

- 注釈

- Avroコレクション 1

- 対応するOracle Loader for Hadoop構成プロパティ 1

- Oracle NoSQL Databaseへの書込み 1

- Oracle Databaseアダプタ 1

- Oracle NoSQL Databaseアダプタ 1

- Tikaファイルの解析 1

- Oracle NoSQL Databaseからの読取り 1

- 順序ファイルの読取り 1

- テキスト・ファイルの読取り 1

- XMLファイルの読取り 1

- テキスト・ファイルの書込み 1

- Apache Hadoopディストリビューション 1 , 2 , 4 , 5

- Apacheライセンス 1 , 2

- avro

- compress注釈 1

- file注釈 1

- put注釈 1

- schema注釈 1

- schema-file注釈 1

- schema-kv注釈 1 , 2 , 3 , 4

- Avro

- 読み取るための注釈 1

- 書き込むための注釈 1

- avro((colon))collection-avroxml関数 1

- avro((colon))get関数 1

- Avro配列,

- XMLとしての読取り 1

- Avroファイル・アダプタ

- 例 1

- XMLとしてのAvroの読取り 1

- AvroとしてのXMLの書込み 1

- Avroファイル

- collection注釈 1

- collection関数 1

- テキストからの変換 1

- 読み取る関数 1

- 出力ファイル名 1

- put関数 1

- レコードの問合せ 1

- 読取り 1

- XMLとしての読取り 1

- 書込み 1

- Avroライセンス 1

- Avroマップ 1

- Avroマップ, XMLとしての読取り 1

- Avro null値 1

- Avroプリミティブ

- XMLとしての読取り 1

- Avroリーダー・スキーマ 1 , 3 , 4

- Avroレコード, XMLとしての読取り 1

- Avro共用体, XMLとしての読取り 1

- avroxmlメソッド 1 , 2

B

- Oracle Loader for Hadoopのロード・バランシング 1

- batchSizeプロパティ 1

- bzip2入力ファイル 1

C

- CDH5ディストリビューション 1

- 文字エンコード 1 , 2

- Hiveの文字メソッド 1

- クライアント・ライブラリ 1

- クライアント

- Hadoopの構成 1

- Rでのデータ型の変換 1

- collection注釈

- テキスト・ファイル 1

- Tikaファイル 1

- collection注釈

- Avro 1

- collection関数(XQuery)

- 説明 1

- collection関数

- Oracle NoSQL Databaseアダプタ 1

- 順序ファイル 1

- テキスト・ファイル 1

- Tikaファイル 1

- collection-tika関数 1 , 2

- columnCountプロパティ(OSCH) 1

- columnLengthプロパティ(OSCH) 1

- columnNamesプロパティ(OSCH) 1

- columnTypeプロパティ(OSCH) 1

- 圧縮データ・ファイル 1

- 圧縮ファイル 1

- 圧縮

- データベース表のデータ 1

- 順序ファイル 1

- 圧縮コーデック 1

- CompressionCodecプロパティ(OSCH) 1

- 圧縮方法

- Avro出力ファイル 1

- 構成プロパティ

- Oracle XQuery for Hadoop 1

- JSONファイル・アダプタ 1

- Oracle NoSQL Databaseアダプタ 1

- Oracle XQuery for Hadoop 1

- 構成設定

- Hadoopクライアント 1

- Sqoopユーティリティ 1

- Hadoopクライアントの構成 1

- RからのOracle Databaseへの接続 1

- consistencyプロパティ 1

- createBadFilesプロパティ 1

- createLogFilesプロパティ 1

- CREATE TABLE

- 構成プロパティ 1

- 例 1

- 構文 1

- CREATE TABLE権限 1

- CSVファイル 1 , 2

D

- データベース・ディレクトリ

- Oracle SQL Connector for HDFS 1

- databaseNameプロパティ, Hive (OSCH) 1

- データベース・パッチ 1 , 2

- データベース権限 1

- データベース・システム, MapReduceジョブを実行するための構成 1

- データベース表

- Oracle XQuery for Hadoopを使用した書込み 1

- dataCompressionCodecプロパティ(OSCH) 1

- dataPathFilterプロパティ(OSCH) 1

- dataPathsプロパティ(OSCH) 1

- データ・ポンプ・ファイル

- XMLテンプレート 1

- データ型のマッピング

- XQueryとAvro間 1

- XQueryとOracle Database間 1

- Oracle DatabaseとXQuery 1

- データ型マッピング, Hive (OSCH) 1

- データ型

- Oracle Loader for Hadoop 1

- Rでのデータ型のテスト 1

- dateMaskプロパティ(OSCH) 1

- defaultDirectoryプロパティ(OSCH) 1

- deflate圧縮 1

- デリミタ付きテキスト・ファイル

- XMLテンプレート 1

- DelimitedTextInputFormatクラス

- Oracle Loader for Hadoop 1

- デリミタ

- テキスト・ファイルの分割 1

- Direct Connector for HDFS 1

- ディレクトリ

- XQueryのデフォルトHDFS 1

- Oracle SQL Connector for HDFSホーム 1

- Sqoopホーム 1

- Directoryプロパティ(OSCH) 1

- disable_directory_link_checkアクセス・パラメータ 1

- 分散キャッシュ

- Oracle XQuery for Hadoopからのアクセス 1

- ソフトウェアのダウンロード 1 , 2 , 3 , 4 , 5

- ドライバ

- JDBC 1 , 2

- ORACLE_DATAPUMP 1

- ORACLE_LOADER 1

- durabilityプロパティ 1

E

- 文字のエンコード 1 , 2

- 指数関数(XQuery) 1

- ExternalTableコマンド

- 構文 1

- 外部表

- 概要 1

F

- fieldLengthプロパティ(OSCH) 1

- fieldTerminatorプロパティ(OSCH) 1

- ファイル・パス

- XQueryでの検索 1

- FLWORの要件 1

- fn

- nilled関数 1 , 2

- fn関数 1

- Hiveのフレーム・メソッド 1

- 関数

- Oracle NoSQL Databaseへの書込み 1

- Oracle NoSQL Database 1 , 2

- Tikaファイルの解析 1 , 2

- 順序ファイルの読取りおよび書込み 1

- テキスト・ファイルの読取りおよび書込み 1

- Avroファイルの読取り 1

- Oracle NoSQL Databaseからの読取り 1 , 2

- JSONファイルの読取り 1

- 順序ファイルの読取り 1

- テキスト・ファイルの読取り 1

- XMLファイルの読取り 1 , 2

- Avroファイルの書込み 1

- 順序ファイルの書込み 1

- テキスト・ファイルの書込み 1

G

- generate-id関数 1

- get関数

- Oracle NoSQL Databaseアダプタ 1

- get-tika関数 1

- gzip入力ファイル 1

H

- HADOOP_HOME環境変数 1

- HADOOP_LIBEXEC_DIR環境変数 1

- Hadoopクライアント

- 構成 1

- インストール 1

- has-children関数 1

- hdfs_stream Bashシェル・スクリプト 1

- HDFSコマンド

- Rからの発行 1

- HDFSデータ

- Rでのコピー 1

- HDFSディレクトリ

- Rでの作成 1

- HDFSディレクトリ 1

- HDFSファイル

- Oracle Databaseへのデータのロード 1

- Oracle R Advanced Analytics for Hadoopでの制限 1

- head関数 1

- hive.columnTypeプロパティ(OSCH) 1

- hive.databaseNameプロパティ(OSCH) 1

- hive.partitionFilterプロパティ 1

- hive.tableNameプロパティ 1

- RからのHiveへのアクセス 1

- RでのHiveへのアクセス 1

- Oracle Loader for HadoopのHiveデータベース 1

- Hiveのデータ型マッピング(OSCH) 1

- Hiveデータ型, サポート 1

- Hiveディストリビューション 1

- Oracle Loader for Hadoop用のHive JARファイル 1

- Hive表

- XML形式 1

- HiveToAvroInputFormatクラス 1 , 2

- hostsプロパティ 1

I

- initialFieldEncloserプロパティ 1

- innermost関数 1

- InputFormatクラス

- Oracle Loader for Hadoop 1

- インストール

- Hadoopクライアント 1

- Oracle Data Integrator Application Adapter for Hadoop 1

- Oracle Loader for Hadoop 1

- Oracle R Advanced Analytics for Hadoop 1

- Oracle SQL Connector for HDFS 1

- Sqoopユーティリティ 1

- インストール手順 1

- Instant Clientライブラリ 1

J

- JDBCドライバ 1 , 2

- json

- get関数 1

- parse-as-xml関数 1

- JSONデータ形式

- XMLに変換 1

- JSONファイル・アダプタ

- 構成プロパティ 1

- JSONファイル

- 読取り 1

- JSONモジュール

- 例 1

K

- kv

- collection注釈 1

- collection-avroxml関数 1

- collection-binxml関数 1

- collection-text関数 1

- collection-xml関数 1

- get注釈 1

- get-avroxml関数 1

- get-binxml関数 1

- get-text関数 1

- get-xml関数 1

- key注釈 1 , 2

- key-range関数 1

- put注釈 1

- put-binxml関数 1

- put-text関数 1

- put-xml関数 1

- KVAvroInputFormatクラス 1

- kv-lob

- get-binxml 1

- get-text 1

- get-tika 1

- get-xml 1

- put-binxml 1

- put-text 1

- put-xml 1

- kvstoreプロパティ 1

- kv-table

- collection-jsontext 1

L

- ライセンス 1

- ライセンス, サードパーティ 1

- ロード・バランシング

- Oracle Loader for Hadoop 1

- LOBSuffixプロパティ 1

- LOBTimeoutプロパティ 1

- locationFileCountプロパティ 1

- log4j.logger.oracle.hadoop.xqueryプロパティ 1

- logDirectoryプロパティ 1

- Hiveの論理メソッド 1

M

- マッピング

- JSONからXML 1

- マッピング

- Oracle Databaseデータ型とXQueryデータ型 1

- マッピング, HiveからOracle Database (OSCH) 1

- MapReduce関数

- Rでの記述 1

- MasterPolicy永続性 1

- Hiveの行列メソッド 1

N

- nilled要素 1

- nilled関数 1

- Avroのnull値 1

- Hiveの数値メソッド 1

O

- OCIダイレクト・パス 1

- オペレーティング・システムのユーザー権限 1

- oracle

- columns注釈 1

- put注釈 1

- ORACLE_DATAPUMPドライバ 1

- ORACLE_LOADERドライバ 1

- oracle.hadoop.exttab.createBadFilesプロパティ 1

- oracle.hadoop.exttab.createLogFilesプロパティ 1

- oracle.hadoop.exttab.hive.tableNameプロパティ 1

- oracle.hadoop.exttab.initialFieldEncloserプロパティ 1

- oracle.hadoop.exttab.locationFileCountプロパティ 1

- oracle.hadoop.exttab.logDirectoryプロパティ 1

- oracle.hadoop.exttab.preprocessorDirectoryプロパティ 1

- oracle.hadoop.exttab.recordDelimiterプロパティ 1

- oracle.hadoop.exttab.sourceTypeプロパティ 1

- oracle.hadoop.exttab.stringSizesプロパティ 1

- oracle.hadoop.exttab.tableNameプロパティ 1

- oracle.hadoop.xquery.*プロパティ 1

- oracle.hadoop.xquery.json.parser.* 1

- oracle.hadoop.xquery.kv.config.durabilityプロパティ 1

- oracle.hadoop.xquery.kv.config.requestLimitプロパティ 1

- oracle.hadoop.xquery.kv.config.requestTimeoutプロパティ 1

- oracle.hadoop.xquery.kv.config.socketOpenTimeoutプロパティ 1

- oracle.hadoop.xquery.kv.config.socketReadTimeoutプロパティ 1

- oracle.hadoop.xquery.kvプロパティ 1

- oracle.hadoop.xquery.lib.shareプロパティ 1

- oracle.hadoop.xquery.tika.html.asisプロパティ 1

- oracle.hadoop.xquery.tika.localeプロパティ 1

- oracle.kv.batchSizeプロパティ 1

- oracle.kv.consistencyプロパティ 1

- oracle.kv.hosts構成プロパティ 1

- oracle.kv.hostsプロパティ 1

- oracle.kv.kvstore構成プロパティ 1

- oracle.kv.kvstoreプロパティ 1

- oracle.kv.timeoutプロパティ 1

- Oracle Database

- 書き込むための注釈 1

- Rからの接続 1

- put関数 1

- ユーザー権限 1

- ORCHからのOracle Databaseへのアクセス 1

- Oracle Databaseアダプタ

- 構成プロパティ 1

- 例 1

- Oracle Databaseアダプタ

- Oracle Loader for Hadoopの使用 1

- Oracle Data Integrator Application Adapter for Hadoop

- インストール 1

- Oracle Direct Connector for HDFS 1

- Oracle Exadata Database Machine

- Hadoopクライアントのインストール 1

- Oracle Instant Clientライブラリ 1

- Oracle Loader for Hadoop

- 説明 1

- 入力形式 1

- インストール 1

- サポートされるデータベース・バージョン 1

- Oracle NoSQL Database

- 書き込むための注釈 1

- Oracle NoSQL Databaseアダプタ

- 読み取るための注釈 1

- collection関数 1

- get関数 1

- XMLとしてのAvroの読取り 1

- AvroとしてのXMLの書込み 1

- Oracle NoSQL Databaseアダプタ

- 構成プロパティ 1

- 例 1

- Oracle NoSQL Databaseの関数 1 , 2

- Oracle OCIダイレクト・パス 1

- Oracle権限 1

- oracle-property注釈 1

- Oracle RACシステム, Hadoopクライアントのインストール 1

- Oracle R Advanced Analytics for Hadoop

- 関数のカテゴリ別リスト 1

- Oracle Databaseへの接続 1

- HDFSデータのコピー 1

- デバッグ関数 1

- 説明 1 , 2

- 発行されるHDFSコマンド 1

- インストール 1

- MapReduce関数 1

- Oracle Software Delivery Cloud 1

- Oracle SQL Connector for HDFS

- 説明 1

- インストール 1

- パターン一致文字 1

- 問合せの最適化 1

- Oracle Technology Network

- ダウンロード 1 , 2

- Oracle XQuery for Hadoop

- 分散キャッシュへのアクセス 1

- ユーザー定義のXQueryライブラリ・モジュールおよびXMLスキーマへのアクセス 1

- 基本的な変換の例 1

- カスタムJava関数の呼出し 1

- 構成プロパティ 1

- Oracle NoSQL Databaseサーバーの構成 1

- 説明 1

- エラー・ロギング・レベル 1

- エラー・リカバリ設定 1

- hadoopコマンド 1

- JSONモジュール 1

- Oracle NoSQL Databaseアダプタ 1

- 出力ディレクトリ 1

- 問合せの実行 1

- ローカルでの問合せの実行 1

- 順序ファイル・アダプタ 1

- 一時ディレクトリ 1

- テキスト・ファイル・アダプタ 1

- Tikaアダプタ 1

- タイムゾーン 1

- XMLファイル・アダプタ 1

- Oracle XQuery for Hadoopアダプタ

- 概要 1

- Oracle XQuery for Hadoopモジュール

- 概要 1

- orahdfs-version/binディレクトリ 1

- orahdfs-version.zipファイル 1

- ora-java

- binding注釈 1

- OraLoader 1

- OraLoaderMetadataユーティリティ・プログラム 1

- oraloader-version.zip 1

- oraloader-version.zipファイル 1 , 2 , 3

- oraloader-versionディレクトリ 1 , 2

- orch.tgzパッケージ 1

- ORCHパッケージ

- インストール 1 , 2

- ore.create関数 1

- ore.exec関数 1

- ore.warn.orderオプション 1

- HiveのORE関数 1

- OSCH_BIN_PATHディレクトリ 1

- outermost関数 1

- output

- encoding注釈 1 , 2 , 3 , 4

- parameter注釈 1

- output注釈 1

- Oracle XQuery for Hadoop用の出力ディレクトリ 1

- oxh

- find関数 1

- increment-counter関数 1

- println関数 1

- println-xml関数 1

- property関数 1

- oxh-charsetプロパティ 1

- oxh-columnプロパティ 1

- oxh-default-namespaceプロパティ 1

- oxh-elementsプロパティ 1

- oxh-entity.nameプロパティ 1

- oxh-namespace.prefixプロパティ 1

- OXMLSerDe 1

P

- 並列処理 1 , 2

- parse-xml-fragment関数 1

- parse-xml関数 1

- JSONファイル用の解析オプション 1

- Tikaファイルの解析 1

- パーティション化 1

- PathFilterプロパティ(OSCH) 1

- Pathsプロパティ(OSCH) 1

- パターン一致 1

- パターン一致(OSCH) 1

- Oracle SQL Connector for HDFSのパターン一致文字 1

- プリプロセッサのアクセス・パラメータ 1

- preprocessorDirectoryプロパティ 1

- 権限, Oracle Database 1

- put関数(XQuery)

- 説明 1

- put関数

- Oracle NoSQL Databaseアダプタ 1

- 順序ファイル 1

- テキスト・ファイル 1

Q

- 問合せ

- Oracle XQuery for Hadoopでの実行 1

- Oracle XQuery for Hadoopでのローカルでの実行 1

- Oracle SQL Connector for HDFSの問合せの最適化 1

R

- ランダム順のメッセージ 1

- Rデータ型, 変換およびテスト 1

- Rディストリビューション 1 , 2

- R Distribution 1 , 2

- Avroファイルの読取り 1

- 順序ファイルの読取り 1

- テキスト・ファイルの読取り 1

- readZonesプロパティ 1

- recordDelimiterプロパティ 1

- レコード, 拒否される 1

- 拒否されるレコード 1

- ReplicaAckポリシー 1

- ReplicaPolicy永続性 1

- requestLimitプロパティ 1

- requestTimeoutプロパティ 1

- R関数

- カテゴリ別のリスト 1

- HiveのR関数 1

S

- データのサンプリング

- Oracle Loader for Hadoop 1

- スクリプト

- Rでのデバッグ 1

- securityプロパティ 1

- seq

- collection注釈 1

- collection-binxml関数 1

- collection関数 1

- collection-xml関数 1

- compress注釈 1

- file注釈 1

- key注釈 1

- put注釈 1

- put-binxml関数 1

- put関数 1

- put-xml関数 1

- split-max注釈 1

- split-min注釈 1

- 順序ファイル・アダプタ

- 書き込むための注釈 1

- collection関数 1

- 例 1

- 順序ファイル・アダプタの関数 1

- 順序ファイル

- 圧縮 1

- 出力ファイル名 1

- 読取り 1

- 分割サイズ 1

- 書込み 1

- シリアライズ・パラメータ 1 , 2

- シリアライズ・パラメータ 1

- serialize関数 1

- skiperrors.countersプロパティ 1

- skiperrors.log.maxプロパティ 1

- skiperrors.maxプロパティ 1

- Oracle XQuery for Hadoop用のskiperrorsプロパティ 1

- snappy圧縮 1

- socketOpenTimeoutプロパティ 1

- socketReadTimeoutプロパティ 1

- ソフトウェアのダウンロード 1 , 2 , 3 , 4 , 5

- sourceTypeプロパティ 1

- 分割サイズ

- Avroファイル 1

- 順序ファイル 1

- テキスト・ファイル 1

- 分割サイズ 1

- XMLファイルの分割 1

- SQL*Loader 1

- Sqoop 1

- Sqoopユーティリティ

- Hadoopクライアントへのインストール 1

- Hadoopクラスタへのインストール 1

- stringSizesプロパティ 1

- 部分範囲の指定, Oracle NoSQL Databaseアダプタ 1

T

- 表

- データベースでの圧縮 1

- HDFSからのデータのコピー 1

- Oracle Databaseへの書込み 1

- tail関数 1

- 一時ディレクトリ, Oracle XQuery for Hadoop用の設定 1

- テキスト

- collection注釈 1

- collection関数 1

- collection-xml関数 1

- compress注釈 1

- file注釈 1

- put注釈 1

- put関数 1

- put-xml関数 1

- split注釈 1

- split-max注釈 1

- trace関数 1

- テキスト・ファイル・アダプタ

- collection関数 1

- put関数 1

- テキスト・ファイル

- Avroへの変換 1

- デリミタ 1

- 読取り 1

- 読取りおよび書込み 1

- 分割サイズ 1

- 書込み 1

- サードパーティ・ライセンス 1 , 2

- Tika

- %output:encoding注釈 1

- %output:media-type注釈 1

- collection注釈 1

- collection関数 1

- helper関数 1

- parse関数 1

- テキスト・データの解析 1

- Tikaアダプタ 1

- Tikaファイル・アダプタ

- collection関数 1

- 解析 1

- Tikaファイル

- 解析 1

- timeoutプロパティ 1

- timestampMaskプロパティ(OSCH) 1

- timestampTZMaskプロパティ(OSCH) 1

- Oracle XQuery for Hadoop用のtimezoneプロパティ 1

- XQueryでのタイムゾーン 1

- 三角関数(XQuery) 1

- 型のマッピング

- XQueryとAvro間 1

- XQueryとOracle Database間 1

U

- 非圧縮ファイル 1

- unparsed-text-available関数 1

- unparsed-text関数 1

- unparsed-text-lines関数 1

- 更新関数 1

- UTF-8エンコード 1 , 2

- UTL_FILEパッケージ 1

V

- Hiveのベクトル・メソッド 1

W

- ワイルドカード 1

- Avroファイルの書込み 1

- 順序ファイルの書込み 1

- テキスト・ファイルの書込み 1

- Oracle表への書込み 1

X

- XML

- Avro配列としての書込み 1

- Avroマップとしての書込み 1

- Avroプリミティブとしての書込み 1

- Avroレコードとしての書込み 1

- Avro共用体としての書込み 1

- XML_EXISTS関数 1

- XML_QUERY_AS_primitive関数 1

- XML_QUERY関数 1

- XML_TABLE関数 1

- xmlf

- collection注釈 1

- collection関数 1

- split注釈 1

- split-entity注釈 1

- split-max注釈 1

- split-min注釈 1 , 2

- split-namespace注釈 1

- XMLファイル・アダプタ

- 例 1

- XMLファイル

- 読取り 1 , 2

- 分割に関する制限 1

- XMLスキーマ

- ユーザー定義へのアクセス 1

- データ・ポンプ・ファイル用XMLテンプレート 1

- XMLテンプレート

- データ・ポンプ・ファイル 1

- デリミタ付きテキスト・ファイル 1

- Hive表 1

- XQuery 1

- xquery.outputプロパティ 1

- xquery.scratchプロパティ 1

- xquery.skiperrors.countersプロパティ 1

- xquery.skiperrors.log.maxプロパティ 1

- xquery.skiperrors.maxプロパティ 1

- xquery.skiperrorsプロパティ 1

- xquery.timezoneプロパティ 1

- XQueryライブラリ・モジュール

- ユーザー定義へのアクセス 1

- XQuery仕様のサポート 1

- XQuery変換

- 要件 1

- xsi

- nil属性 1

オラクルの法律上の注意点について

コピーライトについて

Copyright © 1994-2016, Oracle and/or its affiliates.All rights reserved.

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクルまでご連絡ください。

制限付権利について

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、Oracle Corporationおよびその関連会社は一切の責任を負いかねます。

商標と登録商標について

OracleおよびJavaはオラクルおよびその関連会社の登録商標です。その他の社名、商品名等は各社の商標または登録商標である場合があります。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。適用されるお客様とOracle Corporationとの間の契約に別段の定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。適用されるお客様とOracle Corporationとの間の契約に定めがある場合を除いて、Oracle Corporationおよびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

アルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。Oracle Corporationおよびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

非公開のアルファ版およびベータ版ドラフト・ドキュメントについて

このドキュメントが非公開の試作版の場合:

このドキュメントに含まれる情報は、情報の共有のみを目的としたものであって、顧客諮問委員会(Customer Advisory Board)のメンバーとしてのお客様の立場でのみ、またはお客様のベータ・トライアル契約のみに従って検討されるべきものとします。マテリアル、コード、または機能の提供をお約束するものではなく、購入決定を行う際の判断材料とすべきではありません。このドキュメントに記載されている特徴または機能の開発、リリースおよび時期については、オラクルの裁量により決定されます。

このドキュメントには、ソフトウェアまたは印刷物などの形式を問わず、オラクルが独占的な権利を有する財産的情報が含まれています。この機密資料へのアクセスと使用は、お客様とオラクルとの間で締結され、お客様が遵守に同意した、Oracle Master Agreement、Oracle License and Oracle Services Agreement (オラクル・ライセンスおよびサービスに関する契約書)、Oracle PartnerNetwork Agreement、Oracle Distribution Agreementまたはその他のライセンス契約の条件に従うものとします。このドキュメントとその内容の開示、コピー、複製および配布には、オラクルによる事前の承諾を必要とします。このドキュメントはライセンス契約の一部となるものではなく、オラクルおよびその子会社や関連会社との契約を構成するものではありません。

ドキュメントのアクセシビリティについて

オラクルのアクセシビリティについての詳細情報は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc を参照してください。

Oracle Supportへのアクセス

サポートをご契約のお客様には、My Oracle Supportを通して電子支援サービスを提供しています。詳細情報はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoか、聴覚に障害のあるお客様はhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trsを参照してください。