この章では、Oracle Big Data SQLを使用し、外部表を作成して、Hadoopデータ・ソースやOracle NoSQL Databaseのデータにアクセスする方法を説明します。
Oracle Databaseサーバーに対してOracle Big Data SQLが行う変更の一部についても説明します。
Oracle Big Data SQLでは、Oracle SQL SELECT文の強力なパワーを利用してOracle DatabaseからHive表を問い合せることができます。また、Oracle表とHiveデータを結合する問合せの書込み、堅牢なOracle Databaseセキュリティ機能の活用、および分析関数、JSON処理といった高度なSQL機能の利用もできます。
Oracle Big Data SQLでHive表の問合せを有効にするには、まず、HiveデータのOracle外部表を定義する必要があります。Oracle外部表を作成するのに役立つ多数のツールがあります。
DBMS_HADOOP
DBMS_HADOOPは、CREATE_EXTDDL_FOR_HIVE
プロシージャを含んだPL/SQLパッケージです。このプロシージャは、特定のHive表のOracle外部表を作成するDDLを生成します。オプションで、実行前に生成されたDDLのテキストを編集して外部表のプロパティをカスタマイズできます。
Oracle SQL DeveloperのBig Data SQLウィザード
最新バージョンの無償のOracle SQL DeveloperツールにはBig Data SQLウィザードが含まれています。このプロセスに従って簡単にOracle外部表定義を作成できます。
Oracle SQL Developerに構成済のHive接続がある場合は、Connectionsナビゲータで、接続エントリ・ポイントからHive表にドリル・ダウンし、次を実行します。
表アイコンを右クリックし、「Use in Oracle Big Data SQL...」を選択します
要求されたら、Hive表のインポート用のOracle Database接続を選択します。
Oracle Big Data SQLが有効になっているターゲット・データベースを選択します。
「Create Table」ダイアログで、列、外部表、プロパティ、およびストレージの現在の構成を確認します。必要に応じて変更します。また、生成されるDDLのテキストをプレビューすることもできます。
表の定義の確認を終えたら、「OK」をクリックします。ウィザードによって、指定した場所に外部表が作成されます。
Oracle SQL Developer Data Modeler
これは無償のグラフィカルな設計ツールで、これを使用してHiveメタストアに接続し、外部表を生成できます。1つまたは複数のHive表を選択してインポートし、表のプロパティを必要に応じて変更してから、SQLワークシート内にコピーできるDDLを生成し、Oracle外部表を作成するために実行します。Data Modelerは他のオプションよりも複雑なツールですが、これを使用すると複数のHive表で作業できるという利点があります
Data Modelerの使用方法の詳細は、Oracle Blogスペースの「Oracle Big Data SQLのOracle SQL DeveloperおよびData Modelerのサポート」を参照してください。
関連項目:
Oracle SQL Developerのインストール方法および外部表作成のためのHiveへの接続方法は、「Oracle SQL Developerを使用したHiveへの接続」を参照してくださいDBMS_HADOOP
PL/SQLパッケージには、CREATE_EXTDDL_FOR_HIVE
という名前の関数が含まれています。データ・ディクショナリ言語(DDL)を返して、Hive表にアクセスするための外部表を作成します。この関数では、Hive表に関する基本情報を指定する必要があります。
Hadoopクラスタの名前
Hiveデータベースの名前
Hive表の名前
Hive表がパーティション化されているかどうか
ALL_HIVE_TABLES
データ・ディクショナリ・ビューを問い合せることで、この情報を取得できます。Oracle DatabaseからアクセスできるすべてのHive表に関する情報が表示されます。
この例では、現在のユーザーにデフォルト・データベース内のRATINGS_HIVE_TABLE
という名前のパーティション化されていないHive表へのアクセス権があることを示します。JDOE
という名前のユーザーは所有者です。
SQL> SELECT cluster_id, database_name, owner, table_name, partitioned FROM all_hive_tables; CLUSTER_ID DATABASE_NAME OWNER TABLE_NAME PARTITIONED ------------ -------------- -------- ------------------ -------------- hadoop1 default jdoe ratings_hive_table UN-PARTITIONED
データ・ディクショナリからの情報とともに、DBMS_HADOOP
のCREATE_EXTDDL_FOR_HIVE
関数を使用できます。この例では、現在のスキーマ内のRATINGS_DB_TABLE
のデータベース表名を指定します。関数は、DDLout
という名前のローカル変数でCREATE TABLE
コマンドのテキストを返しますが、実行はしません。
DECLARE DDLout VARCHAR2(4000); BEGIN dbms_hadoop.create_extddl_for_hive( CLUSTER_ID=>'hadoop1', DB_NAME=>'default', HIVE_TABLE_NAME=>'ratings_hive_table', HIVE_PARTITION=>FALSE, TABLE_NAME=>'ratings_db_table', PERFORM_DDL=>FALSE, TEXT_OF_DDL=>DDLout ); dbms_output.put_line(DDLout); END; /
このプロシージャを実行すると、PUT_LINE
関数はCREATE TABLE
コマンドを表示します。
CREATE TABLE ratings_db_table ( c0 VARCHAR2(4000), c1 VARCHAR2(4000), c2 VARCHAR2(4000), c3 VARCHAR2(4000), c4 VARCHAR2(4000), c5 VARCHAR2(4000), c6 VARCHAR2(4000), c7 VARCHAR2(4000)) ORGANIZATION EXTERNAL (TYPE ORACLE_HIVE DEFAULT DIRECTORY DEFAULT_DIR ACCESS PARAMETERS ( com.oracle.bigdata.cluster=hadoop1 com.oracle.bigdata.tablename=default.ratings_hive_table ) ) PARALLEL 2 REJECT LIMIT UNLIMITED
この情報をSQLスクリプトで取得し、アクセス・パラメータを使用して、実行前に必要に応じてOracle表名、列名およびデータ型を変更できます。アクセス・パラメータを使用して日付書式マスクを指定することもできます。
ALL_HIVE_COLUMNS
ビューには、デフォルトの列名およびデータ型の導出方法が表示されます。この例では、Hive列の名前がC0からC7であり、Hive STRING
データ型がVARCHAR2(4000)
にマップされることを示します。
SQL> SELECT table_name, column_name, hive_column_type, oracle_column_type FROM all_hive_columns; TABLE_NAME COLUMN_NAME HIVE_COLUMN_TYPE ORACLE_COLUMN_TYPE --------------------- ------------ ---------------- ------------------ ratings_hive_table c0 string VARCHAR2(4000) ratings_hive_table c1 string VARCHAR2(4000) ratings_hive_table c2 string VARCHAR2(4000) ratings_hive_table c3 string VARCHAR2(4000) ratings_hive_table c4 string VARCHAR2(4000) ratings_hive_table c5 string VARCHAR2(4000) ratings_hive_table c6 string VARCHAR2(4000) ratings_hive_table c7 string VARCHAR2(4000) 8 rows selected.
Oracle SQL Developerでは、Hiveメタストアに接続し、Hiveに対するOracle外部表を作成できます。
次の手順に従って、Oracle Big Data SQLと連携するようにOracle SQL Developerを設定します。
Oracle SQL Developerをインストールします
Hive JDBCドライバをダウンロードします
新しいHive JDBCドライバをOracle SQL Developerに追加します
Hiveへのデータベース接続を作成します。
Oracle SQL Developerのインストール
Oracle SQL Developer 4.2以上をインストールします。HDFSへのOracle Database表のオフロードに便利なOracle Big Data SQLツールである「Copy To Hadoop」のサポートが含まれているため、リリース4.2をお薦めします。
インストールは簡単です。パッケージをダウンロードして抽出するのみです。
Oracle Technology Network (OTN)のOracle SQL Developerダウンロード・サイトに移動します。
ライセンス契約を受け入れ、プラットフォームにとって適切なバージョンをダウンロードします。
たいていのユーザーの場合、「Windows 64–bit with JDK 8 included」が正しい選択です。
ダウンロードしたZIPファイルをローカル・ドライブに抽出します。
抽出先のフォルダ名は任意です。
インストールと構成の詳細は、『Oracle SQL Developerユーザーズ・ガイド』のSQL Developerのインストールおよび開始に関する項を参照してください。
Cloudera Enterprise用のHive JDBCドライバのダウンロードおよびインストール
Oracle SQL DeveloperをHadoop環境のHiveに接続するには、Cloudera Enterprise用のHive JDBCドライバをダウンロードしてインストールする必要があります。これらのドライバは、Oracle SQL Developerのダウンロード・パッケージには付属していません。
HDPユーザーに対する注意:
現時点で、SQL Developer 4.2には、Hive用のCloudera JDBCドライバが必要です。ただし、これらのドライバは、Hortonworksクラスタに対しても動作するように見えます。HDPユーザーは、これらのドライバがその要件に適合するかどうかを判別するためにテストを行う必要があります。最新のHive用Cloudera JDBCドライバをCloudera Webサイトから任意のローカル・ディレクトリにダウンロードします。
Cloudera Webサイトで「cloudera hive jdbc drivers download
」を検索し、使用可能なドライバ・パッケージの場所を特定します。
ドライバ・バージョン、OSおよびOSバージョン(32/64ビット)を選択するよう求められます。現時点で最新のドライバ・バージョンは2.5.18です。使用可能な最新バージョンを選択できます。
アーカイブを解凍します。
unzip hive_jdbc_<version>.zip
抽出したコンテンツを表示します。最上位フォルダの中には、複数のZIPファイルがあります。それぞれが異なるJDBCバージョン用です。この設定では、JBDC 4.0のみ使用可能です。JDBC4_ ZIPファイル(JDBC4_<version>.zip
)を選択します。
重要:
JDBC 4.0用のドライバを含むJDBC4_ ZIPファイルのみを選択してください。これが互換性のある唯一のバージョンです。JDBC41_*
などの他のパッケージのドライバは、SQL Developer 4.2と互換性がなく、接続を試みるとエラーが返されます。Oracle SQL Developerからアクセスできるターゲット・ディレクトリ(./home/oracle/jdbc
など)にJDBC4アーカイブを解凍します。
# unzip Cloudera_HiveJDBC4_<version>.zip -d /home/oracle/jdbc/
抽出されたコンテンツは次のようになります。
Cloudera_HiveJDBC4_2.5.18.1050\Cloudera-JDBC-Driver-for-Apache-Hive-Install-Guide.pdf Cloudera_HiveJDBC4_2.5.18.1050\Cloudera-JDBC-Driver-for-Apache-Hive-Release-Notes.pdf Cloudera_HiveJDBC4_2.5.18.1050\commons-codec-1.3.jar Cloudera_HiveJDBC4_2.5.18.1050\commons-logging-1.1.1.jar Cloudera_HiveJDBC4_2.5.18.1050\HiveJDBC4.jar Cloudera_HiveJDBC4_2.5.18.1050\hive_metastore.jar Cloudera_HiveJDBC4_2.5.18.1050\hive_service.jar Cloudera_HiveJDBC4_2.5.18.1050\httpclient-4.1.3.jar Cloudera_HiveJDBC4_2.5.18.1050\httpcore-4.1.3.jar Cloudera_HiveJDBC4_2.5.18.1050\libfb303-0.9.0.jar Cloudera_HiveJDBC4_2.5.18.1050\libthrift-0.9.0.jar Cloudera_HiveJDBC4_2.5.18.1050\log4j-1.2.14.jar Cloudera_HiveJDBC4_2.5.18.1050\out.txt Cloudera_HiveJDBC4_2.5.18.1050\ql.jar Cloudera_HiveJDBC4_2.5.18.1050\slf4j-api-1.5.11.jar Cloudera_HiveJDBC4_2.5.18.1050\slf4j-log4j12-1.5.11.jar Cloudera_HiveJDBC4_2.5.18.1050\TCLIServiceClient.jar Cloudera_HiveJDBC4_2.5.18.1050\zookeeper-3.4.6.jar
新しいHive JDBCドライバをOracle SQL Developerに追加します
次に、SQL Developerを起動して、抽出したすべてのドライバ・ファイルを「Preferences」ウィンドウの「Third Party JDBC Drivers」にコピーします。
Oracle SQL Developerをダウンロードして抽出したフォルダに移動します。
sqldeveloper
サブフォルダをクリックします。次に、そのフォルダのsqldeveloper.exe
をクリックします。
SQL Developerのメニュー・バーで、「Tools」→「Preferences」を選択します。
「Preferences」ウィンドウのファイル・エクスプローラで、「Database」を展開し、「Third Party JDBC Drivers」をクリックします。
「「Add Entry」をクリックします。
Cloudera_HiveJDBC4_<version>.zip
から抽出したファイルを配置したフォルダに移動します。ZIPから抽出されたすべてのJARファイルをこのウィンドウにコピーして、「OK」をクリックします。
Oracle SQL Developerを再起動します。
Hiveへのデータベース接続の作成
ドライバがインストールされた後、Hiveserver2への接続を作成できます。
Kerberos保護のある接続を作成する場合、ユーザーID、Kerberos接続パラメータ、およびHadoopシステム上でHiveserver2が実行しているポートの番号(通常はポート10000)が必要になります。ユーザーのキータブが存在する必要があります。
Kerberosを使用していない場合は、ユーザーID (oracle
ユーザーまたは同等の権限を持つユーザー)、アカウントのパスワード、およびHiveserver2ポート番号が必要になります。
「New/Select Database Connection」ダイアログの「Oracle」および「Hive」タブの各フィールドに関する説明は、『Oracle SQL Developerユーザーズ・ガイド』のデータベース接続の作成、編集、選択に関する項を参照してください。
いずれの方法を使用してHiveに対するOracle外部表を作成する場合でも(DBMS_HADOOP、Oracle SQL Developer Data Modeler、Oracle SQL DeveloperのOracle Big Dataウィザード、または手動によるコーディング)、ORACLE_HIVE
のデフォルトの動作を変更するにはいくつかのアクセス・パラメータを設定する必要があることがあります。
次の文は、HiveデータにアクセスするためにORDER
という名前の外部表を作成します。
CREATE TABLE order (cust_num VARCHAR2(10), order_num VARCHAR2(20), description VARCHAR2(100), order_total NUMBER (8,2)) ORGANIZATION EXTERNAL (TYPE oracle_hive);
この文ではアクセス・パラメータが設定されていないため、ORACLE_HIVE
アクセス・ドライバはデフォルト設定を使用して次の処理を実行します。
デフォルトのHadoopクラスタに接続します。
order
という名前のHive表を使用します。Hive表にCUST_NUM
、ORDER_NUM
、DESCRIPTION
およびORDER_TOTAL
という名前のフィールドがない場合、エラーが発生します。
CUST_NUM
値が10バイトを超えるなど、変換エラーが発生した場合は、フィールドの値をNULL
に設定します。
外部表の句のACCESS PARAMETERS
句でプロパティを設定できます。これにより、アクセス・ドライバのデフォルトの動作が上書きされます。次の句には、com.oracle.bigdata.overflow
アクセス・パラメータが含まれています。前述の例でこの句を使用する場合、エラーをスローするのではなく、100文字を超えるDESCRIPTION
列のデータが切り捨てられます。
(TYPE oracle_hive ACCESS PARAMETERS ( com.oracle.bigdata.overflow={"action:"truncate", "col":"DESCRIPTION""} ))
次の例では、ORACLE_HIVE
の使用可能なパラメータの大部分を設定します。
CREATE TABLE order (cust_num VARCHAR2(10), order_num VARCHAR2(20), order_date DATE, item_cnt NUMBER, description VARCHAR2(100), order_total (NUMBER(8,2)) ORGANIZATION EXTERNAL (TYPE oracle_hive ACCESS PARAMETERS ( com.oracle.bigdata.tablename: order_db.order_summary com.oracle.bigdata.colmap: {"col":"ITEM_CNT", \ "field":"order_line_item_count"} com.oracle.bigdata.overflow: {"action":"TRUNCATE", \ "col":"DESCRIPTION"} com.oracle.bigdata.erroropt: [{"action":"replace", \ "value":"INVALID_NUM" , \ "col":["CUST_NUM","ORDER_NUM"]} ,\ {"action":"reject", \ "col":"ORDER_TOTAL} ))
これらのパラメータは、ORACLE_HIVE
アクセス・ドライバがデータを特定してエラー条件を処理する方法で、次の変更を行います。
com.oracle.bigdata.tablename
: 表名の違いを処理します。ORACLE_HIVE
は、ORDER.DB
データベース内のORDER_SUMMARY
という名前のHive表を調べます。
com.oracle.bigdata.colmap
: 列名の違いを処理します。HiveのORDER_LINE_ITEM_COUNT
フィールドはOracleのITEM_CNT
列にマップされます。
com.oracle.bigdata.overflow
: 文字列データを切り捨てます。DESCRIPTION
列の100文字を超える値は切り捨てられます。
com.oracle.bigdata.erroropt
: 不正なデータを置換します。CUST_NUM
またはORDER_NUM
のデータのエラーにより、値がINVALID_NUM
に設定されます。
ORACLE_HIVE
アクセス・ドライバを使用して、Oracle NoSQL Databaseに格納されているデータにアクセスできます。ただし、KVStoreにアクセスするHive外部表を最初に作成する必要があります。次に、「HiveデータのOracle外部表の作成」に示されているプロセスのように、それに対してOracle Databaseの外部表を作成できます。
この項の内容は次のとおりです。
Oracle NoSQL Databaseのデータにアクセス可能にするには、Oracle NoSQL表に対してHive外部表を作成します。Oracle Big Data SQLは、HiveによるOracle NoSQL Database表形式の読取りが可能なoracle.kv.hadoop.hive.table.TableStorageHandler
という名前のStorageHandlerを提供します。
Oracle NoSQL表に対するHive外部表のHive CREATE TABLE
文の基本的な構文は次のとおりです。
CREATE EXTERNAL TABLE tablename colname coltype[, colname coltype,...] STORED BY 'oracle.kv.hadoop.hive.table.TableStorageHandler' TBLPROPERTIES ( "oracle.kv.kvstore" = "database", "oracle.kv.hosts" = "nosql_node1:port[, nosql_node2:port...]", "oracle.kv.hadoop.hosts" = "hadoop_node1[,hadoop_node2...]", "oracle.kv.tableName" = "table_name");
Hive CREATE TABLEパラメータ
作成されるHive外部表の名前。
この表名はOracle Databaseで発行されるSQL問合せで使用されるため、ユーザーに適した名前を選択してください。Oracle Databaseで作成する外部表の名前は、このHive表の名前と同じである必要があります。
表、列およびフィールド名は、Oracle NoSQL Database、Apache HiveおよびOracle Databaseで大文字と小文字を区別しません。
Hive外部表の列の名前およびデータ型。Oracle NoSQL DatabaseとHive間のデータ型マッピングは、表2-1を参照してください。
Hive CREATE TABLE TBLPROPERTIES句
KVStoreの名前。大文字、小文字および数字のみが名前で有効です。
Oracle NoSQL Databaseクラスタのホスト名およびポート番号のカンマ区切りリスト。各文字列では形式hostname:portを使用します。ホストで障害が発生した場合の冗長性を提供するには、複数の名前を入力します。
Oracle Big Data SQLが有効であるHadoopクラスタのすべてのホスト名のカンマ区切りリスト。
このHive外部表のデータを格納するOracle NoSQL Databaseの表の名前。
関連項目:
次のApache Hive LanguageManual DDL
次の構文を使用して、Hive外部表を介してOracle NoSQLデータにアクセスできるOracle Databaseの外部表を作成します。
CREATE TABLE tablename(colname colType
[,colname colType
...]) ORGANIZATION EXTERNAL (TYPE ORACLE_HIVE DEFAULT DIRECTORY directory ACCESS PARAMETERS (access parameters) ) REJECT LIMIT UNLIMITED;
この構文では、列名およびデータ型を識別します。この構文の詳細は、「SQL CREATE TABLE文について」を参照してください。
Oracle Big Data SQLがOracle NoSQL Databaseからデータを取得する場合、データが次の別のデータ型に2回変換されます。
データがHive外部表の列に読み込まれる場合にHiveデータ型。
データがOracle Database外部表の列に読み込まれる場合にOracleデータ型。
Oracle NoSQL Database表に格納されたデータに対してBig Data SQL問合せを実行するには、まず、目的のOracle NoSQL Database表のスキーマとマップされているスキーマでHive外部表を作成する必要があります。表2-1に、Oracle NoSQL Database表APIのサポートされているデータ型およびHiveへのマッピングを示します。
表2-1 NoSQL Database表APIのデータ・モデルへのHiveデータ型のマッピング
Oracle NoSQL Database表API | Hive |
---|---|
FieldDef.Type.STRING |
STRING |
FieldDef.Type.BOOLEAN |
BOOLEAN |
FieldDef.Type.BINARY |
BINARY |
FieldDef.Type.FIXED_BINARY |
BINARY |
FieldDef.Type.INTEGER |
INT |
FieldDef.Type.LONG |
BIGINT |
FieldDef.Type.FLOAT |
FLOAT |
FieldDef.Type.DOUBLE |
DOUBLE |
FieldDef.Type.ENUM |
STRING |
FieldDef.Type.ARRAY |
ARRAY |
FieldDef.Type.MAP |
MAP<STRING, data_type> |
FieldDef.Type.RECORD |
STRUCT<col_name : data_type, ...> |
注意:
このマッピングを完成するには、対応するOracle Database外部表を、Hive表のスキーマとマップされているスキーマで作成する必要があります。
また、Hiveデータ型のVARCHAR、CHAR、TINYINT、SMALLINT、DECIMAL、TIMESTAMP、DATE、UNION TYPEは、Oracle NoSQLデータ型からOracle Databaseデータ型へのマッピングに当てはまらないことに注意してください。
関連項目:
HiveからOracle Databaseへのデータ型マッピングの詳細は、「データ型変換について」を参照してください。Oracle Big Data SQLでの述語のプッシュダウンでは、Hiveデータ型とOracleデータ型の間に特定のマッピングが存在する必要があります。「述語のプッシュダウンについて」を参照してください
この例は、Oracle NoSQL Databaseソフトウェアで用意されているサンプル・データを使用します。
次のファイルがexamples/hadoop/table
ディレクトリにあることを確認します。
create_vehicle_table.kvs CountTableRows.java LoadVehicleTable.java
この例は、some1node07という名前のHadoopクラスタ・ノードで実行し、SOME1KVという名前のKVStoreを使用します。
Oracle NoSQL Databaseのサンプルの表を作成して移入するには、次の手順を実行します。
HadoopクラスタでOracle NoSQL Databaseノードへの接続を開きます。
vehicleTable
という名前の表を作成します。次の例は、load
コマンドを使用して、create_vehicle_table.kvs
のコマンドを実行します。
$ cd NOSQL_HOME
$ java -jar lib/kvcli.jar -host some1node07 -port 5000 \
load -file examples/hadoop/table/create_vehicle_table.kvs
LoadVehicleTable.java
をコンパイルします。
$ javac -cp examples:lib/kvclient.jar examples/hadoop/table/LoadVehicleTable.java
LoadVehicleTable
クラスを実行して、表に移入します。
$ java -cp examples:lib/kvclient.jar hadoop.table.LoadVehicleTable -host some1node07 -port 5000 -store SOME1KV
{"type":"auto","make":"Chrysler","model":"PTCruiser","class":"4WheelDrive","colo
r":"white","price":20743.240234375,"count":30}
{"type":"suv","make":"Ford","model":"Escape","class":"FrontWheelDrive","color":"
.
.
.
10 new records added
vehicleTable
表には、次のフィールドが含まれています。
表2-2 vehicleTable例のフィールド
フィールド名 | データ型 |
---|---|
type |
STRING |
Make |
STRING |
model |
STRING |
クラス |
STRING |
color |
STRING |
price |
DOUBLE |
count |
INTEGER |
次の例では、SOME1KV KVStoreのvehicleTable
にアクセスするVEHICLES
という名前のHive表を作成します。この例のシステムは、最初の6つのサーバー(some1node01からsome1node06)のHadoopクラスタと次の3つのサーバー(some1node07からsome1node09)のOracle NoSQL Databaseクラスタで構成されます。
CREATE EXTERNAL TABLE IF NOT EXISTS vehicles (type STRING, make STRING, model STRING, class STRING, color STRING, price DOUBLE, count INT) COMMENT 'Accesses data in vehicleTable in the SOME1KV KVStore' STORED BY 'oracle.kv.hadoop.hive.table.TableStorageHandler' TBLPROPERTIES ("oracle.kv.kvstore" = "SOME1KV", "oracle.kv.hosts" = "some1node07.example.com:5000,some1node08.example.com:5000", "oracle.kv.hadoop.hosts" = "some1node01.example.com,some1node02.example.com,some1node03.example.com,some1node04.example.com,some1node05.example.com,some1node06.example.com", "oracle.kv.tableName" = "vehicleTable");
DESCRIBE
コマンドは、VEHICLES
表の列をリストします。
hive> DESCRIBE vehicles;
OK
type string from deserializer
make string from deserializer
model string from deserializer
class string from deserializer
color string from deserializer
price double from deserializer
count int from deserializer
Hive VEHICLES
表に対する問合せは、Oracle NoSQL vehicleTable
表のデータを返します。
hive> SELECT make, model, class FROM vehicletable WHERE type='truck' AND color='red' ORDER BY make, model; Total MapReduce jobs = 1 Launching Job 1 out of 1 Number of reduce tasks determined at compile time: 1 . . . Chrysler Ram1500 RearWheelDrive Chrysler Ram2500 FrontWheelDrive Ford F150 FrontWheelDrive Ford F250 RearWheelDrive Ford F250 AllWheelDrive Ford F350 RearWheelDrive GM Sierra AllWheelDrive GM Silverado1500 RearWheelDrive GM Silverado1500 AllWheelDrive
Hive表を作成した後、メタデータをOracle Database静的データ・ディクショナリ・ビューで使用できます。次のSQL SELECT
文は、前のトピックで作成されたHive表の情報を返します。
SQL> SELECT table_name, column_name, hive_column_type FROM all_hive_columns WHERE table_name='vehicles'; TABLE_NAME COLUMN_NAME HIVE_COLUMN_TYPE --------------- ------------ ---------------- vehicles type string vehicles make string vehicles model string vehicles class string vehicles color string vehicles price double vehicles count int
次のSQL CREATE TABLE
文は、ORACLE_HIVE
アクセス・ドライバを使用して、Hive VEHICLES
表に対するVEHICLES
という名前の外部表を生成します。Oracle Databaseの表の名前は、Hiveの表の名前と同じである必要があります。ただし、Oracle NoSQL DatabaseおよびOracle Databaseは、大文字と小文字を区別しません。
CREATE TABLE vehicles (type VARCHAR2(10), make VARCHAR2(12), model VARCHAR2(20), class VARCHAR2(40), color VARCHAR2(20), price NUMBER(8,2), count NUMBER) ORGANIZATION EXTERNAL (TYPE ORACLE_HIVE DEFAULT DIRECTORY DEFAULT_DIR ACCESS PARAMETERS (com.oracle.bigdata.debug=true com.oracle.bigdata.log.opt=normal)) REJECT LIMIT UNLIMITED;
このSQL SELECT
文は、Oracle NoSQL DatabaseのvehicleTable
から赤いトラックのすべての行を取得します。
SQL> SELECT make, model, class FROM vehicles WHERE type='truck' AND color='red' ORDER BY make, model; MAKE MODEL CLASS ------------ -------------------- --------------------- Chrysler Ram1500 RearWheelDrive Chrysler Ram2500 FrontWheelDrive Ford F150 FrontWheelDrive Ford F250 AllWheelDrive Ford F250 RearWheelDrive Ford F350 RearWheelDrive GM Sierra AllWheelDrive GM Silverado1500 RearWheelDrive GM Silverado1500 4WheelDrive GM Silverado1500 AllWheelDrive
ORACLE_HIVE
アクセス・ドライバを使用して、Apache HBaseに格納されているデータにアクセスすることもできます。ただし、最初にHBase表にアクセスするHive外部表を作成する必要があります。次に、それに対してOracle Databaseの外部表を作成できます。基本的な手順は、「Oracle NoSQL DatabaseのOracle外部表の作成」で説明されているものと同じです。
HBase表のデータにアクセス可能にするには、それに対してHive外部表を作成します。Apacheは、ストレージ・ハンドラおよびHiveによるHBase表形式の読取りが可能なSerDeを提供します。
HBase表に対する外部表のHive CREATE TABLE
文の基本的な構文は、次のとおりです。
CREATE EXTERNAL TABLE tablename colname coltype[, colname coltype,...] ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe' STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( 'serialization.format'='1', 'hbase.columns.mapping'=':key,value:key,value:
関連項目:
次のApache Hive LanguageManual DDL
次のHive HBaseIntegration
https://cwiki.apache.org/confluence/display/Hive/HBaseIntegration#HBaseIntegration-StorageHandlers
次のHive APIリファレンスのClass HBaseSerDe
http://hive.apache.org/javadocs/r0.13.1/api/hbase-handler/index.html
次の構文を使用して、Hive外部表を介してHBaseデータにアクセスできるOracle Databaseの外部表を作成します。
CREATE TABLE tablename(colname colType
[,colname colType
...]) ORGANIZATION EXTERNAL (TYPE ORACLE_HIVE DEFAULT DIRECTORY DEFAULT_DIR ACCESS PARAMETERS (access parameters) ) REJECT LIMIT UNLIMITED;
この構文では、列名およびデータ型を識別します。アクセス・パラメータを指定するには、「SQL CREATE TABLE文について」を参照してください。
ORACLE_HDFS
アクセス・ドライバを使用すると、HDFSに格納されている様々なタイプのデータにアクセスできますが、HDFSにはHiveメタデータはありません。テキスト・データのレコード形式を定義することも、特定のデータ形式のSerDeを指定することもできます。
HDFSファイルの外部表を手動で作成し、データを特定するためにアクセス・ドライバが必要とするすべての情報を提供して、レコードおよびフィールドを解析する必要があります。CREATE TABLE ORGANIZATION EXTERNAL
文のいくつかの例を次に示します。
次の文は、ORDER
という名前の文を作成して、HDFSの/usr/cust/summary
ディレクトリに格納されているすべてのファイル内のデータにアクセスします。
CREATE TABLE ORDER (cust_num VARCHAR2(10), order_num VARCHAR2(20), order_total NUMBER (8,2)) ORGANIZATION EXTERNAL ( TYPE oracle_hdfs DEFAULT DIRECTORY DEFAULT_DIR ) LOCATION ('hdfs:/usr/cust/summary/*');
この文ではアクセス・パラメータが設定されていないため、ORACLE_HDFS
アクセス・ドライバはデフォルト設定を使用して次の処理を実行します。
デフォルトのHadoopクラスタに接続します。
ファイルをデリミタ付きテキスト、フィールドをSTRING
タイプとして読み取ります。
HDFSファイル内のフィールドの数は、列の数と一致すると仮定します(この例では3)。
CUST_NUM
データが第1フィールド、ORDER_NUM
データが第2フィールド、ORDER_TOTAL
データが第3フィールドになるように、フィールドは列と同じ順序であることを前提とします。
値によってデータ変換エラーが発生するレコードを拒否します。CUST_NUM
の値が10文字を超える場合、ORDER_NUM
の値が20文字を超える場合、またはORDER_TOTAL
の値がNUMBER
に変換できない場合です。
ORACLE_HDFS
でも、ORACLE_HIVE
と同じアクセス・パラメータの多くを使用できます。
次の例は、「ORACLE_HIVEのデフォルト設定の上書き」に示した例に相当します。外部表は、HDFSに格納されているデリミタ付きテキスト・ファイルにアクセスします。
CREATE TABLE order (cust_num VARCHAR2(10), order_num VARCHAR2(20), order_date DATE, item_cnt NUMBER, description VARCHAR2(100), order_total NUMBER(8,2)) ORGANIZATION EXTERNAL ( TYPE oracle_hdfs DEFAULT DIRECTORY DEFAULT_DIR ACCESS PARAMETERS ( com.oracle.bigdata.colmap: {"col":"item_cnt", "field":"order_line_item_count"} com.oracle.bigdata.overflow: {"action":"TRUNCATE", "col":"DESCRIPTION"} com.oracle.bigdata.erroropt: [{"action":"replace", \ "value":"INVALID NUM", \ "col":["CUST_NUM","ORDER_NUM"]} , \ {"action":"reject", "col":"ORDER_TOTAL}] ) LOCATION ('hdfs:/usr/cust/summary/*'));
これらのパラメータは、ORACLE_HDFS
アクセス・ドライバがデータを特定してエラー条件を処理する方法で、次の変更を行います。
com.oracle.bigdata.colmap
: 列名の違いを処理します。HDFSファイル内のORDER_LINE_ITEM_COUNT
は、外部表のITEM_CNT
列と一致します。
com.oracle.bigdata.overflow
: 文字列データを切り捨てます。DESCRIPTION
列の100文字を超える値は切り捨てられます。
com.oracle.bigdata.erroropt
: 不正なデータを置換します。CUST_NUM
またはORDER_NUM
のデータのエラーにより、値がINVALID_NUM
に設定されます。
次の例では、SerDeを使用してAvroコンテナ・ファイルにアクセスします。
CREATE TABLE order (cust_num VARCHAR2(10), order_num VARCHAR2(20), order_date DATE, item_cnt NUMBER, description VARCHAR2(100), order_total NUMBER(8,2)) ORGANIZATION EXTERNAL ( TYPE oracle_hdfs DEFAULT DIRECTORY DEFAULT_DIR ACCESS PARAMETERS ( com.oracle.bigdata.rowformat: \ SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe' com.oracle.bigdata.fileformat: \ INPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'\ OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat' com.oracle.bigdata.colmap: { "col":"item_cnt", \ "field":"order_line_item_count"} com.oracle.bigdata.overflow: {"action":"TRUNCATE", \ "col":"DESCRIPTION"} ) LOCATION ('hdfs:/usr/cust/summary/*'));
アクセス・パラメータは、次の情報をORACLE_HDFS
アクセス・ドライバうに提供します。
com.oracle.bigdata.rowformat
: アクセス・ドライバがレコードおよびフィールドを解析するために使用する必要があるSerDeを識別します。ファイルはデリミタ付きテキスト形式ではありません。
com.oracle.bigdata.fileformat
: レコードを抽出し、それらを目的の形式で出力できるJavaクラスを識別します。
com.oracle.bigdata.colmap
: 列名の違いを処理します。ORACLE_HDFS
は、外部表のITEM_CNT
列を持つHDFSファイル内のORDER_LINE_ITEM_COUNT
と一致します。
com.oracle.bigdata.overflow
: 文字列データを切り捨てます。DESCRIPTION
列の100文字を超える値は切り捨てられます。
Kafka用のHiveストレージ・ハンドラにより、HiveおよびOracle Big Data SQLでKafkaトピックの問合せを実行できるようになります。
ORACLE_HIVEアクセス・ドライバは、Kafkaデータ・トピックにアクセスできます。KafkaトピックにアクセスするHive外部表を最初に作成して、その表に基づくOracle Big Data SQL表を作成します。
Kafka用Hiveストレージ・ハンドラにより、HiveおよびOracle Big Data SQLは、Kafkaトピックに問合せを実行できるようになります。
Kafkaデータへのアクセスを提供するために、Kafkaトピックに基づくHive外部表を作成します。HiveでKafkaデータ形式を読み取れるようにするOracle Big Data SQLストレージ・ハンドラは、oracle.hadoop.kafka.hive.KafkaStorageHandler
です。
このストレージ・ハンドラを使用すると、Kafkaに存在するデータが基になる外部Hive表を作成できます。Big Data SQLは、この外部Hive表によってKafkaデータの問合せを実行できるようになります。
次に、Hive DDLの使用例を示します。この例ではtopic1とtopic2はKafkaブローカの2つのトピックです。これらのキーはKafkaのStringシリアライザによってシリアル化されていて、その値はkafkaのLongシリアライザによってシリアル化されています。
CREATE EXTERNAL TABLE test_table row format serde ‘oracle.hadoop.kafka.hive.KafkaSerDe’ stored by 'oracle.hadoop.kafka.hive.KafkaStorageHandler' tblproperties('oracle.kafka.table.key.type'='string', 'oracle.kafka.table.value.type'='long', 'oracle.kafka.bootstrap.servers'='nshgc0602:9092', 'oracle.kafka.table.topics'='topic1,topic2');
次の例は、結果のHive表を示しています。Kafkaのキー、値、オフセット、トピック名およびパーティションIDがHive列にマップされています。Hive問合せのWHERE句によって、トピック/パーティションのペアごとのオフセットを明示的に指定できます。
hive> describe test_table; OK topic string from deserializer partitionid int from deserializer key string from deserializer value bigInt from deserializer offset bigint from deserializer timestamptype smallInt from deserializer timestamp timestamp from deserializer Time taken: 0.084 seconds, Fetched: 7 row(s)
hive> select * from test_table where (topic="topic1" and partitoinid=0 and offset > 199) or (topic="topic1" and partitionid=1 and offset > 198) or (topic="topic2" and partitionid=0 and offset > 177) or (topic="topic2" and partitionid=1 and offset > 176);すべてのトピック/パーティションのオフセットをトラッキングする必要があります。たとえば、こうしたオフセットの保管にはOracle表を使用できます。それよりも便利な新規データのトラッキング方法は、timestamp列を使用することです。次の問合せを使用して、特定の時点の後のデータを照会できます。
hive> select * from test_table where timestamp > '2017-07-12 11:30:00';
すべての表プロパティの説明は、次の「プロパティのリファレンス」の項を参照してください
プロパティのリファレンス
表2-3 Kafka用Hiveストレージ・ハンドラの表プロパティ
プロパティ名 | 要件 | 説明 |
---|---|---|
oracle.kafka.table.topics |
必須 |
Kafkaトピックのカンマ区切りリスト。それぞれのKafkaトピック名は、文字(大文字と小文字)、数字、. (ドット)、_ (アンダースコア)および- (マイナス記号)で構成されている必要があります。トピック名ごとの最大長は249です。これらのトピックは、同じシリアル化メカニズムを備えている必要があります。結果のHive表は、ここにリストされたすべてのトピックのレコードで構成されています。Hive列"topic"が追加され、レコードごとのトピック名に設定されます。 |
oracle.kafka.bootstrap.servers |
必須 |
このプロパティは、基礎となるKafkaコンシューマの"bootstrap.servers"プロパティに変換されます。コンシューマは、ここで指定されたサーバーに関係なく、すべてのサーバーをブートストラップに使用します。このリストは、サーバーの完全なセットを検出するために使用される最初のホストにのみ影響します。このリストは、 |
oracle.kafka.table.key.type |
オプション |
レコードのキー・タイプ。未設定の場合、Hive行ではKafkaレコードのキー部分が無視されます。サポートされる値は、"string"、"integer"、"long"、"double"、"avro"、"avro_confluent"の値のみです。"string"、"integer"、"double"および"long"は、Kafkaでサポートされるプリミティブの組込みシリアル化タイプに相応します。このプロパティがこれらのプリミティブ・タイプのいずれかの場合、レコードごとのKafkaキーは1つのHive列にマップされます。このプロパティが"avro"または"avro_confluent"に設定されている場合は、 "avro"と"avro_confluent"の違いは、シリアル化のワイヤ形式がわずかに異なっていることです。"avro"の場合、キーのバイト配列全体はavroシリアル化のバイトで構成されます。"avro_confluent"の場合、バイト配列はマジック・バイト、バージョン番号、キーのavroシリアル化のバイトという順序で構成されます。 |
oracle.kafka.table.value.type |
オプション |
レコードの値タイプ。未設定の場合は、Kafkaレコードの値部分がHive行で無視されます。このプロパティの使用方法は、 |
oracle.kafka.table.key.writer.schema |
オプション |
KafkaキーのAvroシリアル化に対するオプションのライター・スキーマ。キーがKafkaブローカに書き込まれたスキーマとキーのリーダー・スキーマが異なる場合に必要です。これは、Kafkaキーがシリアル化されたスキーマそのものになっている必要があります。 |
oracle.kafka.table.key.schema |
"oracle.kafka.table.key.type"が"avro"または"avro_confluent"の場合は必須 |
KafkaキーのAvroリーダー・スキーマに対応するJSON文字列。KafkaキーのライターAvroスキーマと完全に同じである必要はありません。リーダー・スキーマにKafkaキーまたはコンバータから変換されたオブジェクトとの互換性があれば有効です。これにより、Hive列の名前を変更して、Hive行のKafkaキーから維持するフィールドを選択できるようになります。このプロパティのスキーマとKafkaキーがシリアル化されたスキーマが異なる場合は、 |
oracle.kafka.table.value.writer.schema |
オプション |
Kafka値のAvroシリアル化に対するオプションのライター・スキーマ。使用方法は |
oracle.kafka.table.value.schema |
"oracle.kafka.table.value.type"が"avro"または"avro_confluent"の場合は必須 |
Kafka値のAvroリーダー・スキーマに対するJSON文字列。使用方法は |
oracle.kafka.table.extra.columns |
オプション(デフォルトは"true") |
追加のKafka列( |
oracle.kafka.chop.partition |
オプション(デフォルトはfalse) |
Kafkaパーティションをより小さなチャンクに分割するかどうかを制御するブール・フラグ。これは、Kafkaパーティションの数が少なく、それぞれのKafkaパーティションのサイズが大きい場合に便利です。 |
oracle.kafka.partition.chunk.size |
オプション |
oracle.kafka.chop.partitionがtrueの場合は、このプロパティにより各パーティション・チャンク内のKafkaレコードの数を制御します。(理想的な分割サイズ)/(Kafkaレコードの平均サイズ)で見積もられる値に設定する必要があります。たとえば、理想的な分割サイズが256 MBであり、Kafkaレコードの平均サイズが256バイトの場合、このプロパティは1000000に設定する必要があります。 |
Big Data SQLは、ORACLE_HIVEアクセス・ドライバを使用して、Hive表に保存されているデータの問合せを実行できます。
Kafka用Hiveストレージ・ハンドラを使用してKafkaデータに基づくHive表を作成した後で、結果のHive表からBig Data SQL表を生成するための特別な手順はありません。デフォルトのORACLE_HIVE設定は、その他のHive表と同じ方法でオーバーライドできます。これは、前述の項で示したKafka用Hiveストレージ・ハンドラを使用して作成したHive外部テーブルを問い合せる方法です。
CREATE TABLE test_table( topic varchar2(50), partitionid integer, key varchar2(50), value integer, offset integer, timestamptype integer, timestamp timestamp ) ORGANIZATION EXTERNAL (TYPE ORACLE_HIVE DEFAULT DIRECTORY DEFAULT_DIR ACCESS PARAMETERS ( com.oracle.bigdata.cluster=hadoop1 com.oracle.bigdata.tablename=default.test_table ) ) PARALLEL 2 REJECT LIMIT UNLIMITED
parquetファイルを読み込むために、Oracle Big Data SQL用カスタムParquetリーダーを使用するオプションがあります。
カスタム・リーダーにはI/Oを削減する最適化(非フィルタ述語列の遅延取得とマテリアライズ)が組み込まれています。行グループ(約128 MBデータ)のフィルタを評価するときに、カスタム・リーダーは最初にフィルタ述語の列のみを取得します。フィルタが適用されて一致がない場合、リーダーは次の行グループに処理を進めます。行の一致がある場合は、非フィルタ列が読み込まれます。フィルタ評価では、一致する列索引の値のみを効率的にデシリアライズ(マテリアライズ)するためのデータ構造を構築します。これは、Hiveの実装とは異なります。Hiveの実装では、選択リストのすべての列を読み込んでデシリアライズ(マテリアライズ)した後、述語列のフィルタを評価して、最終的に一致する値から行を構築します。この最適化により、行グループ内でフィルタに一致する行が存在しない場合は常にI/Oが減少します。この場合、述語列以外は一切読み込まれません。
カスタム・リーダーでは次の2つの方法でCPUの消費も削減します。
個別のParquetページ(最小読取り単位)の解凍は、それらのページにフィルタを満たす値が含まれていない場合はスキップします。これは、プリミティブな列タイプにのみ適用され、ネストされた列タイプには適用されません。
一致する行索引に属していない個別の列値のデシリアライズをスキップします。
カスタムParquetリーダーの無効化または再有効化
com.oracle.bigdata.useOracleParquet=falseこの設定をクラスタのプロパティ・ファイルに追加すると、すべてのParquetベースの外部表に対する最適化を無効化できます。デフォルトに戻すには、この設定を削除します。
以前に作成したParquet形式のデータとの互換性
カスタム・リーダーを使用するために、データ形式を変更する必要はありません。ただし、最高のパフォーマンスを得るために、その形式では各Parquetブロックの列ごとに最小値と最大値を指定する必要があります。これらの値は、問合せを最適化するために、標準のHadoop Parquet InputFormatとカスタムParquetリーダーで使用されます。この結果として得られる最適化により、HiveとOracle Big Data SQLの両方で問合せのパフォーマンスが大幅に向上します。
Impalaで作成したParquetファイルには、各Parquetブロックの列ごとに最小値と最大値が含まれていない点に注意してください。
最小値と最大値を使用できるようにするために、Hiveまたは標準のHadoop Parquet InputFormatで出力を生成するその他のツール(PrestoDBやSparkなど)でParquetファイルを作成することをお薦めします。
これらの値がファイルに含まれているかどうかを確認するには、parquetツールのJARを使用してファイルに関する情報をダンプします。
# hadoop jar parquet-tools-1.5.0-cdh5.12.0.jar meta <filename>.parq
CDH Hadoopディストリビューションでは、parquet-tools
コマンドをパスに構成することもできます。
SQLのCREATE TABLE
文には、外部表の作成に特化した句があります。この句に指定する情報により、アクセス・ドライバは外部ソースからデータを読み取り、そのデータを外部表用に準備できます。
次に外部表のCREATE TABLE
文の基本的な構文を示します。
CREATE TABLE table_name (column_name datatype, column_name datatype[,...]) ORGANIZATION EXTERNAL (external_table_clause);
他の表と同様に、列名およびデータ型を指定します。ORGANIZATION EXTERNAL
は、表を外部表として識別します。
external_table_clauseはアクセス・ドライバを識別し、データのロードに必要な情報を提供します。「外部表の句について」を参照してください。
CREATE TABLE ORGANIZATION EXTERNAL
は、引数としてexternal_table_clauseを取ります。次の従属句があります。
関連項目:
external_table_clauseの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。
TYPE
句はアクセス・ドライバを識別します。アクセス・ドライバのタイプによって、外部表定義の他の部分がどのように解釈されるかが決まります。
Oracle Big Data SQLに次の値のいずれかを指定します。
ORACLE_HDFS
: HDFSディレクトリ内のファイルにアクセスします。
ORACLE_HIVE
: Hive表にアクセスします。
注意:
ORACLE_DATAPUMP
およびORACLE_LOADER
アクセス・ドライバは、Oracle Big Data SQLには関連付けられません。
DEFAULT DIRECTORY
句はOracle Databaseディレクトリ・オブジェクトを識別します。ディレクトリ・オブジェクトは、外部表が読取りおよび書込みを行うファイルを含むオペレーティング・システム・ディレクトリを識別します。
ORACLE_HDFS
およびORACLE_HIVE
はデフォルト・ディレクトリのみを使用して、Oracle Databaseシステムにログ・ファイルを書き込みます。
ORACLE_HDFS
のLOCATION
句には、ファイルの場所のコンマ区切りのリストが含まれます。ファイルは、デフォルト・クラスタ上のHDFSファイル・システムに存在する必要があります。
場所は次のいずれかになります。
完全修飾HDFSディレクトリ名(/user/hive/warehouse/hive_seed/hive_types
など)。ORACLE_HDFS
はディレクトリ内のすべてのファイルを使用します。
完全修飾HDFSファイル名(/user/hive/warehouse/hive_seed/hive_types/hive_types.csv
など)。
HDFSファイルまたはファイルのセットのURL (hdfs:/user/hive/warehouse/hive_seed/hive_types/*
など)。ディレクトリ名のみの使用は無効です。
ファイル名には、表2-4に説明されているパターン一致文字を含めることができます。
表2-4 パターン一致文字
文字 | 説明 |
---|---|
? |
任意の1文字に一致します。 |
* |
0文字以上の文字に一致します。 |
[abc] |
セット{a, b, c}内の1文字に一致します。 |
[a-b] |
範囲{a...b}内の1文字に一致します。文字は、b以下である必要があります。 |
[^a] |
文字セットまたは範囲{a}外の1文字に一致します。カレット(^)は、左カッコの直後に付ける必要があります(スペースなし)。 |
\c |
cの特別な意味を無効にします。バックスラッシュ(\)は、エスケープ文字です。 |
{ab\,cd} |
セット{ab, cd}内の文字列に一致します。エスケープ文字(\)は、パス区切りとしてのコンマの意味を無効にします。 |
{ab\,c{de\,fh} |
セット{ab, cde, cfh}内の文字列に一致します。エスケープ文字(\)は、パス区切りとしてのコンマの意味を無効にします。 |
ORACLE_HIVE
にLOCATION
句を指定しないでください。指定すると、エラーが発生します。データはHiveに格納され、アクセス・パラメータおよびメタデータ・ストアは必要な情報を提供します。
Oracle Databaseが問合せを停止し、エラーを返すまで、外部表の問合せ中に許可される変換エラーの数を制限します。
行が拒否される処理エラーは、制限に対してカウントされます。拒否制限は、各並列問合せ(PQ)プロセスに個別に適用されます。すべてのPQプロセスについて、拒否されたすべての行の合計ではありません。
ACCESS PARAMETERS
句は、アクセス・ドライバがデータを外部表に正しくロードするために必要な情報を提供します。「CREATE TABLE ACCESS PARAMETERS句」を参照してください。
アクセス・ドライバは、データを外部表にロードする際に、Hiveデータをターゲット列のデータ型に変換できることを確認します。互換性がない場合、アクセス・ドライバはエラーを返します。それ以外の場合は、適切なデータ変換を行います。
通常、Hiveは他の場所(HDFSファイル内など)に格納されているデータに表抽象化レイヤーを提供します。Hiveはシリアライザ/デシリアライザ(SerDe)を使用して、必要に応じてデータを格納されている形式からHiveデータ型に変換します。その後、アクセス・ドライバはHiveデータ型からOracleデータ型にデータを変換します。たとえば、テキスト・ファイルに対するHive表にBIGINT
列がある場合、SerDeはデータをテキストからBIGINT
に変換します。その後、アクセス・ドライバはデータをBIGINT
(Hiveデータ型)からNUMBER
(Oracleデータ型)に変換します。
2つではなく1つのデータ型変換を実行する場合、パフォーマンスが向上します。したがって、HDFSファイル内のフィールドのデータ型は、ディスク上に実際に格納されているデータを示す必要があります。たとえば、JSONはクリア・テキスト形式であるため、JSONファイル内のデータはすべてテキストです。フィールドのHiveタイプがDATE
の場合、SerDeはデータを文字列(データ・ファイル内)からHive日付に変換します。その後、アクセス・ドライバはデータをHive日付からOracle日付に変換します。ただし、フィールドのHiveタイプが文字列の場合、SerDeは変換を実行せず、アクセス・ドライバはデータを文字列からOracle日付に変換します。2番目の例では、外部表に対する問合せはより速くなります。これは、アクセス・ドライバがデータ変換のみを実行するためです。
次の表に、データを外部表にロードするときにORACLE_HIVE
が実行できるデータ型変換を示します。
表2-5 サポートされているHiveデータ型からOracleデータ型への変換
Hiveデータ型 | VARCHAR2、CHAR、NCHAR2、NCHAR、CLOB | NUMBER、FLOAT、BINARY_NUMBER、BINARY_FLOAT | BLOB | RAW | DATE、TIMESTAMP、TIMESTAMP WITH TZ、TIMESTAMP WITH LOCAL TZ | INTERVAL YEAR TO MONTH、INTERVAL DAY TO SECOND |
---|---|---|---|---|---|---|
INT SMALLINT TINYINT BIGINT |
はい |
はい |
はい |
はい |
いいえ |
いいえ |
DOUBLE FLOAT |
はい |
はい |
はい |
はい |
いいえ |
いいえ |
DECIMAL |
はい |
はい |
いいえ |
いいえ |
いいえ |
いいえ |
BOOLEAN |
はい脚注 1 |
はい脚注2 |
はい脚注 2 |
はい |
いいえ |
いいえ |
BINARY |
はい |
いいえ |
はい |
はい |
いいえ |
いいえ |
STRING |
はい |
はい |
いいえ |
いいえ |
はい |
はい |
TIMESTAMP |
はい |
いいえ |
いいえ |
いいえ |
はい |
いいえ |
STRUCT ARRAY UNIONTYPE MAP |
はい |
いいえ |
いいえ |
いいえ |
いいえ |
いいえ |
脚注1
FALSEは文字列FALSE
にマップされ、TRUEは文字列TRUE
にマップされます。
脚注2
FALSEは0にマップされ、TRUEは1にマップされます。
Hadoopクラスタ上のデータを問い合せるユーザーには、外部表、およびクラスタ・ディレクトリを指すデータベース・ディレクトリ・オブジェクトへのOracle Database内のREAD
アクセス権が必要です。「クラスタ・ディレクトリについて」を参照してください。
デフォルトでは、列の値を計算しているときにエラーが発生した場合、問合せはデータを返しません。ほとんどのエラー(特に、列の値を計算中にスローされたエラー)の後も処理は続行します。
エラーの処理方法を決定するには、com.oracle.bigdata.erroropt
パラメータおよびcom.oracle.bigdata.overflowパラメータを使用します。
この項では、Oracle Big Data SQLインストールによってOracle Databaseシステム(Oracle Exadata Machineなど)に加えられる変更について説明します。
bigdata_config
ディレクトリには、すべてのHadoopクラスタに共通の構成情報が含まれています。このディレクトリは、Oracle Databaseシステムの$ORACLE_HOME/bigdatasql
の下にあります。oracle
ファイル・システムのユーザー(またはOracle Databaseインスタンスを所有するユーザー)は、bigdata_config
を所有します。Oracleデータベース・ディレクトリORACLE_BIGDATA_CONFIG
はbigdata_config
を指します。
インストールで、これらのファイルは$ORACLE_HOME/bigdatasql
の下のbigdata_config
ディレクトリ内に格納されます。
Oracle DBAは、必要に応じてこれらの構成ファイルを編集できます。
共通ディレクトリ内の bigdata.properties
ファイルには、HDFS内のデータにアクセスするために必要なJavaクラス・パスおよびネイティブ・ライブラリ・パスを定義するプロパティ/値のペアが含まれています。
次のプロパティを設定する必要があります。
次のリストで、bigdata.properties
で許可されているすべてのプロパティを説明します。
bigdata.properties
プロパティ | 説明 |
---|---|
bigdata.cluster.default |
デフォルトのHadoopクラスタの名前。アクセス・パラメータがクラスタを指定しない場合、アクセス・ドライバはこの名前を使用します。必須。 デフォルトのクラスタ名を変更すると、明示的なクラスタ名なしで以前に作成された外部表が使用できなくなる可能性があります。 |
bigdata.cluster.list |
Hadoopクラスタ名のコンマ区切りのリスト。オプション。 |
java.classpath.hadoop |
Hadoopクラス・パス。必須。 |
java.classpath.hive |
Hiveクラス・パス。必須。 |
java.classpath.oracle |
Oracle JXAD Java JARファイルへのパス。必須。 |
java.classpath.user |
ユーザーJARファイルへのパス。オプション。 |
java.libjvm.file |
JVM共有ライブラリ( |
java.options |
JVMに渡されるオプションのコンマ区切りのリスト。オプション。 この例では、最大ヒープ・サイズを2GBに設定し、Java Native Interface (JNI)呼出しの詳細なロギングを設定します。 Xmx2048m,-verbose=jni |
java.options2 |
JVMに渡されるオプションのスペース区切りのリスト。オプション。デリミタは単一の空白文字にする必要があります。その他のタブなどの空白文字は使用できません。 この例では、最大ヒープ・サイズを2GBに設定し、Java Native Interface (JNI)呼出しの詳細なロギングを設定します。 Xmx2048m -verbose=jni 注意: java.options はカンマ区切りですが、java.options2 は空白区切りです。これら2つのプロパティは、同じbigdata.properties ファイル内に共存できます。 |
LD_LIBRARY_PATH |
Hadoopネイティブ・ライブラリを検索するためのディレクトリ・パスのコロン区切りの(:)リスト。推奨。 このオプションを設定した場合は、 |
例2-1は、サンプルのbigdata.properties
ファイルを示します。
例2-1 サンプルのbigdata.propertiesファイル
# bigdata.properties # # Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. # # NAME # bigdata.properties - Big Data Properties File # # DESCRIPTION # Properties file containing parameters for allowing access to Big Data # Fixed value properties can be added here # java.libjvm.file=$ORACLE_HOME/jdk/jre/lib/amd64/server/libjvm.so java.classpath.oracle=$ORACLE_HOME/hadoopcore/jlib/*:$ORACLE_HOME/hadoop/jlib/hver-2/*:$ORACLE_HOME/dbjava/lib/* java.classpath.hadoop=$HADOOP_HOME/*:$HADOOP_HOME/lib/* java.classpath.hive=$HIVE_HOME/lib/* LD_LIBRARY_PATH=$ORACLE_HOME/jdk/jre/lib bigdata.cluster.default=hadoop_cl_1
共通ディレクトリのbigdata-log4j.properties
ファイルは、外部表に対する問合せのロギング動作をJavaコードで定義します。このファイルでは、すべてのlog4j
プロパティを使用できます。
例2-2に、サンプルのbigdata-log4j.properties
ファイルと、関連するlog4j
プロパティを示します。
例2-2 サンプルのbigdata-log4j.propertiesファイル
# bigdata-log4j.properties # # Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. # # NAME # bigdata-log4j.properties - Big Data Logging Properties File # # DESCRIPTION # Properties file containing logging parameters for Big Data # Fixed value properties can be added here bigsql.rootlogger=INFO,console log4j.rootlogger=DEBUG, file log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.target=System.err log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n log4j.logger.oracle.hadoop.sql=ALL, file bigsql.log.dir=. bigsql.log.file=bigsql.log log4j.appender.file.File=$ORACLE_HOME/bigdatalogs/bigdata-log4j.log
クラスタ・ディレクトリには、Hadoopクラスタの構成情報が含まれています。Oracle DatabaseがOracle Big Data SQLを使用してアクセスする各クラスタにクラスタ・ディレクトリがあります。このディレクトリは、Oracle Databaseシステムの$ORACLE_HOME/bigdatasql/clusters/
の下にあります。たとえば、クラスタbda1_cl_1
にはディレクトリ$ORACLE_HOME/bigdatasql/clusters/bda1_c1_1
があり、$ORACLE_HOME/bigdatasql/clusters/bda1_c1_1/config
には次のファイルがあります。これらは、クラスタにアクセスするためのクライアント構成ファイルです。
bigdata.hosts
(顧客による編集不可)
core-site.xml
hdfs-site.xml
hive-site.xml
mapred-site.xml
(optional)
log4j
プロパティ・ファイル(hive-log4j.properties
など)
$ORACLE_HOME/bigdatasql/databases/<データベース名>/bigdata_config/default_cluster
は、デフォルト・クラスタのディレクトリへのソフト・リンクです。
データベース・ディレクトリ・オブジェクトはクラスタ・ディレクトリを指します。クラスタ内のデータにアクセスするユーザーには、ディレクトリ・オブジェクトの読取りアクセス権が必要です。