2 データ・アクセスのためのOracle Big Data SQLの使用

Oracle Big Data SQLでは、Oracle SQL SELECT文の強力なパワーを利用して多様なデータ・ソースを問い合せることができます。

この章では、Hive、Hadoop、Apache Kafka、Oracle NoSQL Databaseおよびオブジェクト・ストアからのデータを介してOracle Big Data SQL対応の外部表を作成する方法について説明します。

2.1 外部表の作成

Oracle Big Data SQLでは、Oracle SQL SELECT文の強力なパワーを利用して、Oracle DatabaseからOracle Big Data SQL対応の外部表を介して外部データを問い合せることができます。また、Oracle表と外部データを結合する問合せの書込み、堅牢なOracle Databaseセキュリティ機能の活用、および分析関数、JSON処理といった高度なSQL機能の利用もできます。

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

2.1.1 SQL CREATE TABLE文について

SQLのCREATE TABLE文には、外部表の作成に特化した句があります。この句に指定する情報により、アクセス・ドライバは外部ソースからデータを読み取り、そのデータを外部表用に準備できます。

2.1.1.1 基本的な構文

次に外部表のCREATE TABLE文の基本的な構文を示します。

CREATE TABLE table_name (column_name datatype, 
                         column_name datatype[,...]) 
   ORGANIZATION EXTERNAL (external_table_clause);

他の表と同様に、列名およびデータ型を指定します。ORGANIZATION EXTERNALは、表を外部表として識別します。

external_table_clauseはアクセス・ドライバを識別し、データのロードに必要な情報を提供します。「外部表の句について」を参照してください。

2.1.1.2 外部表の句について

CREATE TABLE ORGANIZATION EXTERNAL文は、引数として外部表の句を取ります。外部表句には次の副次句があります。

TYPE

TYPE句はアクセス・ドライバを識別します。アクセス・ドライバのタイプによって、外部表定義の他の部分がどのように解釈されるかが決まります。

Oracle Big Data SQLに次の値のいずれかを指定します。

  • ORACLE_HDFS: HDFSディレクトリ内のファイルにアクセスします。

  • ORACLE_HIVE: Hive表にアクセスします。

  • ORACLE_BIGDATA: オブジェクト・ストアのファイルにアクセスします。

ノート:

ORACLE_DATAPUMPおよびORACLE_LOADERアクセス・ドライバは、Oracle Big Data SQLには関連付けられません。

DEFAULT DIRECTORY

DEFAULT DIRECTORY句はOracle Databaseディレクトリ・オブジェクトを識別します。ディレクトリ・オブジェクトは、外部表が読取りおよび書込みを行うファイルを含むオペレーティング・システム・ディレクトリを識別します。

ORACLE_HDFSORACLE_BIGDATAおよびORACLE_HIVEは、デフォルト・ディレクトリのみを使用して、Oracle Databaseシステムにログ・ファイルを書き込みます。

LOCATION

LOCATION句はデータ・ソースを識別します。

REJECT LIMIT

REJECT LIMITは、Oracle Databaseが問合せを停止し、エラーを返すまで、外部表の問合せ中に許可される変換エラーの数を制限します。

行が拒否される処理エラーは、制限に対してカウントされます。拒否制限は、各並列問合せ(PQ)プロセスに個別に適用されます。すべてのPQプロセスについて、拒否されたすべての行の合計ではありません。

ACCESS PARAMETERS

ACCESS PARAMETERS句は、アクセス・ドライバがデータを外部表に正しくロードするために必要な情報を提供します

2.1.2 HiveデータのOracle外部表の作成

Oracle Big Data SQL外部表を作成する際に、Hiveメタデータを利用できます。

外部表の作成は、HDFSのデータだけでなく、Oracle NoSQL Database、Apache Kafka、HBase、オブジェクト・ストアなど他のストレージ・タイプのデータにもアクセスできる手法です。

Oracle Big Data SQLでHive表の問合せを有効にするには、まず、HiveデータのOracle外部表を定義する必要があります。Oracle外部表を作成するのに役立つ多数のツールがあります。これらのツールでは、基礎となるHiveメタデータを利用するため、表の作成が容易になります。

外部表は、抽象化のレベルを実現します。基礎となるパーティションやファイル・タイプは変更される可能性がありますが、Oracle外部表の定義は同じままです。表を問い合せると、これらの変更が自動的に取得されます。

外部表の定義の一部として、表の列とそのデータ型、およびHiveのソース表へのポインタを指定します。データの場所、ファイル・タイプ、パーティション化情報など、残りのメタデータは問合せの実行時に導出されます。

  • 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表にドリル・ダウンし、次を実行します。

    1. 表アイコンを右クリックし、「Use in Oracle Big Data SQL...」を選択します

    2. 要求されたら、Hive表のインポート用のOracle Database接続を選択します。

    3. Oracle Big Data SQLが有効になっているターゲット・データベースを選択します。

    4. 「Create Table」ダイアログで、列、外部表、プロパティ、およびストレージの現在の構成を確認します。必要に応じて変更します。また、生成されるDDLのテキストをプレビューすることもできます。

    5. 表の定義の確認を終えたら、「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への接続」を参照してください
2.1.2.1 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
2.1.2.2 CREATE_EXTDDL_FOR_HIVE関数の使用

データ・ディクショナリからの情報とともに、DBMS_HADOOPCREATE_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.
2.1.2.3 Oracle SQL Developerを使用したHiveへの接続

Oracle SQL Developerでは、Hiveメタストアに接続し、Hiveに対するOracle外部表を作成できます。

次のステップに従って、Oracle Big Data SQLと連携するようにOracle SQL Developerを設定します。

  1. Oracle SQL Developerをインストールします

  2. Hive JDBCドライバをダウンロードします

  3. 新しいHive JDBCドライバをOracle SQL Developerに追加します

  4. Hiveへのデータベース接続を作成します。

Oracle SQL Developerのインストール

Oracle SQL Developer 4.2以上をインストールします。このバージョン以降、HDFSへのOracle Database表のオフロードに便利なOracle Big Data SQLツールである「Copy To Hadoop」のサポートが含まれています。

インストールは簡単です。パッケージをダウンロードして抽出するのみです。

  1. Oracle Technology Network (OTN)のOracle SQL Developerダウンロード・サイトに移動します。

  2. ライセンス契約を受け入れ、プラットフォームにとって適切なバージョンをダウンロードします。

    たいていのユーザーの場合、「Windows 64–bit with JDK 8 included」が正しい選択です。

  3. ダウンロードした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ユーザーは、これらのドライバがその要件に適合するかどうかを判別するためにテストを行う必要があります。
  1. 最新のHive用Cloudera JDBCドライバをCloudera Webサイトから任意のローカル・ディレクトリにダウンロードします。

    Cloudera Webサイトで「cloudera hive jdbc drivers download」を検索し、使用可能なドライバ・パッケージの場所を特定します。

    ドライバ・バージョン、OSおよびOSバージョン(32/64ビット)を選択するよう求められます。現時点で最新のドライバ・バージョンは2.5.18です。使用可能な最新バージョンを選択できます。

  2. アーカイブを解凍します。

    unzip hive_jdbc_<version>.zip
  3. 抽出したコンテンツを表示します。最上位フォルダの中には、複数のZIPファイルがあります。それぞれが異なるJDBCバージョン用です。この設定では、JBDC 4.0のみ使用可能です。JDBC4_ ZIPファイル(JDBC4_<version>.zip)を選択します。

    重要:

    JDBC 4.0用のドライバを含むJDBC4_ ZIPファイルのみを選択してください。これが互換性のある唯一のバージョンです。JDBC41_*などの他のパッケージのドライバは、SQL Developer 4.2と互換性がなく、接続を試みるとエラーが返されます。
  4. 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」にコピーします。

  1. SQL Developerを起動します。
  2. SQL Developerのメニュー・バーで、「Tools」→「Preferences」を選択します。

  3. 「Preferences」ウィンドウのファイル・エクスプローラで、「Database」を展開し、「Third Party JDBC Drivers」をクリックします。

  4. 「「Add Entry」をクリックします。

  5. Cloudera_HiveJDBC4_<version>.zipから抽出したファイルを配置したフォルダに移動します。ZIPから抽出されたすべてのJARファイルをこのウィンドウにコピーして、「OK」をクリックします。

  6. Oracle SQL Developerを再起動します。

Hiveへのデータベース接続の作成

ドライバがインストールされた後、Hiveserver2への接続を作成できます。

Kerberos保護のある接続を作成する場合、ユーザーID、Kerberos接続パラメータ、およびHadoopシステム上でHiveserver2が実行しているポートの番号(通常はポート10000)が必要になります。ユーザーのキータブが存在する必要があります。

Kerberosを使用していない場合は、ユーザーID (oracleユーザーまたは同等の権限があるユーザー)、アカウントのパスワード、およびHiveserver2ポート番号が必要になります。

「New/Select Database Connection」ダイアログの「Oracle」および「Hive」タブの各フィールドに関する説明は、『Oracle SQL Developerユーザーズ・ガイド』データベース接続の作成、編集、選択に関する項を参照してください。

2.1.2.4 ORACLE_HIVEのCREATE TABLE文の作成

いずれの方法を使用してHiveに対するOracle外部表を作成する場合でも(DBMS_HADOOP、Oracle SQL Developer Data Modeler、Oracle SQL DeveloperのOracle Big Dataウィザード、または手動によるコーディング)、ORACLE_HIVEのデフォルトの動作を変更するにはいくつかのアクセス・パラメータを設定する必要があることがあります。

ノート:

LOCATION句をORACLE_HIVEとともに含めないでください。エラーが発生します。データはHiveに格納され、アクセス・パラメータおよびメタデータ・ストアは必要な情報を提供します。

2.1.2.4.1 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_NUMORDER_NUMDESCRIPTIONおよびORDER_TOTALという名前のフィールドがない場合、エラーが発生します。

  • CUST_NUM値が10バイトを超えるなど、変換エラーが発生した場合は、フィールドの値をNULLに設定します。

2.1.2.4.2 ORACLE_HIVEのデフォルト設定の上書き

外部表の句の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に設定されます。

関連項目:

CREATE TABLE ACCESS PARAMETERS句の項では、ORACLE_HIVEORACLE_HDFSおよびORACLE_BIGDATAのアクセス・パラメータの完全なリストを示します。
2.1.2.5 Hiveデータ型からOracleデータ型への変換

アクセス・ドライバは、データを外部表にロードする際に、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-1 サポートされている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にマップされます。

2.1.3 Oracle NoSQL DatabaseのOracle外部表の作成

ORACLE_HIVEアクセス・ドライバを使用して、Oracle NoSQL Databaseに格納されているデータにアクセスできます。ただし、KVStoreにアクセスするHive外部表を最初に作成する必要があります。次に、「HiveデータのOracle外部表の作成」に示されているプロセスのように、それに対してOracle Databaseの外部表を作成できます。

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

2.1.3.1 Oracle NoSQL DatabaseのHive外部表の作成

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パラメータ

tablename

作成されるHive外部表の名前。

この表名はOracle Databaseで発行されるSQL問合せで使用されるため、ユーザーに適した名前を選択してください。Oracle Databaseで作成する外部表の名前は、このHive表の名前と同じである必要があります。

表、列およびフィールド名は、Oracle NoSQL Database、Apache HiveおよびOracle Databaseで大文字と小文字を区別しません。

colname coltype

Hive外部表の列の名前およびデータ型。Oracle NoSQL DatabaseとHive間のデータ型マッピングは、表2-2を参照してください。

Hive CREATE TABLE TBLPROPERTIES句

oracle.kv.kvstore

KVStoreの名前。大文字、小文字および数字のみが名前で有効です。

oracle.kv.hosts

Oracle NoSQL Databaseクラスタのホスト名およびポート番号のカンマ区切りリスト。各文字列では形式hostname:portを使用します。ホストで障害が発生した場合の冗長性を提供するには、複数の名前を入力します。

oracle.kv.hadoop.hosts

Oracle Big Data SQLが有効であるHadoopクラスタのすべてのホスト名のカンマ区切りリスト。

oracle.kv.tableName

このHive外部表のデータを格納するOracle NoSQL Databaseの表の名前。

2.1.3.2 Oracle NoSQLデータのOracle Database表の作成

次の構文を使用して、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文について」を参照してください。

2.1.3.3 Oracle NoSQLからOracle Databaseへの型マッピングについて

Oracle Big Data SQLがOracle NoSQL Databaseからデータを取得する場合、データが次の別のデータ型に2回変換されます。

  • データがHive外部表の列に読み込まれる場合にHiveデータ型。

  • データがOracle Database外部表の列に読み込まれる場合にOracleデータ型。

Oracle NoSQL Database表に格納されたデータに対してBig Data SQL問合せを実行するには、まず、目的のOracle NoSQL Database表のスキーマとマップされているスキーマでHive外部表を作成する必要があります。表2-2に、Oracle NoSQL Database表APIのサポートされているデータ型およびHiveへのマッピングを示します。

表2-2 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へのデータ型マッピングの詳細は、Hiveデータ型からOracleデータ型への変換を参照してください。

Oracle Big Data SQLでの述語のプッシュダウンでは、Hiveデータ型とOracleデータ型の間に特定のマッピングが存在する必要があります。「述語のプッシュダウンについて」を参照してください

2.1.3.4 Oracle NoSQL Databaseのデータのアクセス例

この例は、Oracle NoSQL Databaseソフトウェアで用意されているサンプル・データを使用します。

2.1.3.4.1 Oracle NoSQL Database表の例の作成

次のファイルがexamples/hadoop/tableディレクトリにあることを確認します。

create_vehicle_table.kvs
CountTableRows.java
LoadVehicleTable.java

この例は、some1node07という名前のHadoopクラスタ・ノードで実行し、SOME1KVという名前のKVStoreを使用します。

Oracle NoSQL Databaseのサンプルの表を作成して移入するには、次の手順を実行します。

  1. HadoopクラスタでOracle NoSQL Databaseノードへの接続を開きます。

  2. 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
  3. LoadVehicleTable.javaをコンパイルします。

    $ javac -cp examples:lib/kvclient.jar examples/hadoop/table/LoadVehicleTable.java
  4. 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-3 vehicleTable例のフィールド

フィールド名 データ型

type

STRING

Make

STRING

model

STRING

クラス

STRING

color

STRING

price

DOUBLE

count

INTEGER

2.1.3.4.2 vehicleTableのHive表の例の作成

次の例では、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
2.1.3.4.3 VEHICLESのOracle表の作成

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

2.1.4 Apache HBaseのOracle外部表の作成

ORACLE_HIVEアクセス・ドライバを使用して、Apache HBaseに格納されているデータにアクセスすることもできます。ただし、最初にHBase表にアクセスするHive外部表を作成する必要があります。次に、それに対してOracle Databaseの外部表を作成できます。基本的なステップは、「Oracle NoSQL DatabaseのOracle外部表の作成」で説明されているものと同じです。

2.1.4.1 HBaseのHive外部表の作成

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:
2.1.4.2 HBaseのOracle Database表の作成

次の構文を使用して、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文について」を参照してください。

2.1.5 HDFSファイルのOracle外部表の作成

ORACLE_HDFSアクセス・ドライバを使用すると、HDFSに格納されている様々なタイプのデータにアクセスできますが、HDFSにはHiveメタデータはありません。テキスト・データのレコード形式を定義することも、特定のデータ形式のSerDeを指定することもできます。

HDFSファイルの外部表を手動で作成し、データを特定するためにアクセス・ドライバが必要とするすべての情報を提供して、レコードおよびフィールドを解析する必要があります。CREATE TABLE ORGANIZATION EXTERNAL文のいくつかの例を次に示します。

2.1.5.1 デフォルトのアクセス・パラメータとORACLE_HDFSの使用

次の文は、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に変換できない場合です。

関連項目:

CREATE TABLE ACCESS PARAMETERS句の項では、ORACLE_HIVEORACLE_HDFSおよびORACLE_BIGDATAのアクセス・パラメータの完全なリストを示します。
2.1.5.2 ORACLE_HDFS LOCATION句

ORACLE_HDFSLOCATION句には、ファイルの場所のコンマ区切りのリストが含まれます。ファイルは、デフォルト・クラスタ上の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}内の文字列に一致します。エスケープ文字(\)は、パス区切りとしてのコンマの意味を無効にします。

2.1.5.3 ORACLE_HDFSのデフォルト設定の上書き

ORACLE_HDFSでも、ORACLE_HIVEと同じアクセス・パラメータの多くを使用できます。

2.1.5.3.1 デリミタ付きテキスト・ファイルへのアクセス

次の例は、「ORACLE_HIVEのデフォルト設定の上書き」に示した例に相当します。外部表は、HDFSに格納されているデリミタ付きテキスト・ファイルにアクセスします。

CREATE TABLE taxis
(
 dispatching_base_num varchar2(100),
 pickup_date varchar2(100),
 location_id varchar2(100)
)
ORGANIZATION EXTERNAL
  (TYPE ORACLE_HDFS
   DEFAULT DIRECTORY DEFAULT_DIR
  ACCESS PARAMETERS
  (
    com.oracle.bigdata.fileformat=TEXTFILE
    com.oracle.bigdata.rowformat=DELIMITED FIELDS TERMINATED BY ','
  )
   LOCATION ('/data/taxi-trips/')
  )
REJECT LIMIT UNLIMITED;

このソースには列を説明するメタデータが含まれていないため、colmapフィールドがないことに注意してください。この場合に必要なアクセス・パラメータは、fileformatrowformatのみです。

ヒント:

フィールドと値を区切るデリミタとして、コロン(:)ではなく等号(=)を使用することをお薦めします。これは、コロンをデリミタにすると、ツールによってはパラメータ値の入力が求められるためです。

2.1.5.3.2 Avroコンテナ・ファイルへのアクセス

次の例では、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文字を超える値は切り捨てられます。

2.1.5.3.3 JSONデータへのアクセス

JSON形式のデータを解析できるように、Oracle Big Data SQLユーザー機能がOracle SQLに組み込まれています。

Oracle SQLでは、列内のアクセス可能なJSONデータ(外部データまたはデータベース内に格納されているデータ)を解析できます。

たとえば、次に、HDFSに格納されているstation_information.jsonというJSONファイルを示します。

{
"station_id":"72","name":"W 52 St & 11 Ave","short_name":"6926.01",
"lat":40.76727216,"lon":-73.99392888,"region_id":71,"rental_methods":["CREDITCARD","KEY"],
"capacity":39,"rental_url":"http://app.citibikenyc.com/S6Lr/IBV092JufD?station_id=72",
"eightd_has_key_dispenser":false}{"station_id":"79","name":"Franklin St & W Broadway",
"short_name":"5430.08","lat":40.71911552,"lon":-74.00666661,"region_id":71,
"rental_methods":["CREDITCARD","KEY"],
"capacity":33,"rental_url":"http://app.citibikenyc.com/S6Lr/IBV092JufD?station_id=79",
"eightd_has_key_dispenser":false}{"station_id":"82",
"name":"St James Pl & Pearl St","short_name":"5167.06","lat":40.71117416,
"lon":-74.00016545,"region_id":71,"rental_methods":["CREDITCARD","KEY"],
"capacity":27,"rental_url":"http://app.citibikenyc.com/S6Lr/IBV092JufD?station_id=82",
"eightd_has_key_dispenser":false
}
       

このデータを問い合せるには、次の手順を実行します。

  1. まず、このデータに対するHDFS外部表を作成します。列としてVARCHAR2という単一のテキストを追加します。(大きなJSONオブジェクトの場合は、かわりにCLOBを使用できます。)
    CREATE TABLE
        bikes.stations_ext ( 
            doc varchar2(4000) 
        ) 
        ORGANIZATION EXTERNAL      
        ( TYPE ORACLE_HDFS       
          DEFAULT DIRECTORY DEFAULT_DIR       
          LOCATION ('/data/bike-stations')     
        )
        REJECT LIMIT UNLIMITED;
  2. 次に、外部表を問い合せます。Oracle SQLのJSON_VALUE関数の使用方法に注意してください。
    select 
        s.doc.station_id, s.doc.name, s.doc.lon as longitude,        
        s.doc.lat as latitude, s.doc.capacity,        
        s.doc.eightd_has_key_dispenser, s.doc.rental_methods,        
        json_value(doc, '$.rental_methods[0]'),
        json_value(doc, '$.rental_methods[1]') from stations_exts

関連項目:

Oracle SQL言語リファレンスには、JSON_VALUE構文とその他の例が記載されています。

2.1.6 Kafkaトピック用Oracle外部表の作成

Oracle Big Data SQLでは、Kafka用Hiveストレージ・ハンドラの使用とOracle SQL Access to Kafkaの使用という2つの方法でKafkaデータを使用できます。

  • Kafka用Hiveストレージ・ハンドラの使用

    ORACLE_HIVEアクセス・ドライバでは、Oracle Big Data SQLインストールに含まれているHiveストレージ・ハンドラを使用してKafkaトピックにアクセスできます。KafkaトピックにアクセスするHive外部表を最初に作成してから、その表に基づくOracle Big Data SQL表を作成します。OracleのKafka用Hiveストレージ・ハンドラを使用したKafkaトピック用Hive外部表の作成を参照してください。

  • Oracle SQL Access to Kafkaの使用

    Oracle SQL Access to Kafkaでは、Oracle SQLで、HiveまたはHadoopを使用せずにKafkaトピックにアクセスできます。ORA_KAFKA PL/SQLパッケージには、これを有効にする関数およびプロシージャが含まれています。ORA_KAFKA.REGISTER_CLUSTERを使用してデータベース・スキーマにKafkaクラスタを登録してから、ORA_KAFKA.CREATE_VIEWSプロシージャを使用してビューを作成します。このプロシージャによって内部で外部表が作成されるため、外部表を明示的に作成する必要はありません。Oracle SQL Access to Kafkaを参照してください。

前述の2つのオプションの比較:

Kafka用Hiveストレージ・ハンドラ Oracle SQL Access to Kafka
Big Data SQL構文の使用 ORA_KAFKAの関数およびプロシージャを使用します。
HiveとHadoopが必要 HiveおよびHadoopは必要ありません。データベース・システムでJavaプロセスを実行する必要があります。
問合せへの回答時に述語のプッシュダウンを使用:

述語のプッシュダウンが必要な問合せに最適なオプションです。たとえば、Kafka内の大量のデータから検索する問合せなどです。述語のプッシュダウンは、partitioned、topic、offsetおよびtimestamp列に対して定義されている結合問合せ(a AND b AND c)でサポートされています。

KafkaオフセットおよびKafkaタイムスタンプ管理の使用によるオフセットまたはタイムスタンプでのメッセージの読取り:

最新のKafkaメッセージ(5秒前から現在の時刻までのメッセージなど)や、特定のオフセットまたはタイムスタンプから始まる一連のメッセージ(タイムスタンプtまたはオフセットoから始まる1000件のメッセージなど)を検索する問合せに最適なオプションです。

Avro (スキーマレスまたはスキーマフル)形式のメッセージのサポート CSV形式およびJSON形式のメッセージのサポート
KafkaトピックのHive問合せが可能 複数のデータベース・ビューでKafkaを問い合せることができます。各アプリケーションには独自の一連のビューおよびオフセット管理が備わっています。それにより、各アプリケーションでKafkaストリームの別々の部分を読み取ることができます。
2.1.6.1 OracleのKafka用Hiveストレージ・ハンドラを使用したKafkaトピック用Hive外部表の作成

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問合せが実行されたときのKafkaトピックのスナップショットです。新しいデータがKafkaトピックに挿入されたときには、offset列またはtimestamp列を使用してトピックへの変更をトラッキングできます。オフセットはトピック/パーティションが単位になります。たとえば、次の問合せは、トピック/パーティションごとのwhere句で指定されたオフセットの後の新しいメッセージを返します。
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-5 Kafka用Hiveストレージ・ハンドラの表プロパティ

プロパティ名 要件 説明

oracle.kafka.table.topics

必須

Kafkaトピックのカンマ区切りリスト。それぞれのKafkaトピック名は、文字(大文字と小文字)、数字、. (ドット)、_ (アンダースコア)および- (マイナス記号)で構成されている必要があります。トピック名ごとの最大長は249です。これらのトピックは、同じシリアル化メカニズムを備えている必要があります。結果のHive表は、ここにリストされたすべてのトピックのレコードで構成されています。Hive列"topic"が追加され、レコードごとのトピック名に設定されます。

oracle.kafka.bootstrap.servers

必須

このプロパティは、基礎となるKafkaコンシューマの"bootstrap.servers"プロパティに変換されます。コンシューマは、ここで指定されたサーバーに関係なく、すべてのサーバーをブートストラップに使用します。このリストは、サーバーの完全なセットを検出するために使用される最初のホストにのみ影響します。このリストは、host1:port1,host2:port2,....の形式にする必要があります。これらのサーバーは、(動的に変更される可能性がある)完全なクラスタ・メンバーシップを検出するための初期接続にのみ使用されるため、このリストにサーバーの完全なセットが含まれている必要はありません。可用性のために、複数のサーバーをリストしてもかまいません。

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"に設定されている場合は、oracle.kafka.table.key.schemaが必要になります。レコードごとのKafkaキーは、Avroオブジェクトにデシリアライズされます。Avroスキーマがレコード・タイプの場合は、レコードのそれぞれの第1レベルのフィールドが1つのHive列にマップされます。Avroスキーマがレコード・タイプでない場合は、"key"というHive列にマップされます。

"avro"と"avro_confluent"の違いは、シリアル化のワイヤ形式がわずかに異なっていることです。"avro"の場合、キーのバイト配列全体はavroシリアル化のバイトで構成されます。"avro_confluent"の場合、バイト配列はマジック・バイト、バージョン番号、キーのavroシリアル化のバイトという順序で構成されます。

oracle.kafka.table.value.type

オプション

レコードの値タイプ。未設定の場合は、Kafkaレコードの値部分がHive行で無視されます。このプロパティの使用方法は、oracle.kafka.table.key.typeの使用法と同様です。これら違いは、Kafka値に対するAvroスキーマがレコード・タイプでない場合です。Avroオブジェクト全体は、"key"ではなく"value"という名前の1つの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.key.writer.schemaが必要になります。

oracle.kafka.table.value.writer.schema

オプション

Kafka値のAvroシリアル化に対するオプションのライター・スキーマ。使用方法はoracle.kafka.table.key.writer.schemaと同様です。

oracle.kafka.table.value.schema

"oracle.kafka.table.value.type"が"avro"または"avro_confluent"の場合は必須

Kafka値のAvroリーダー・スキーマに対するJSON文字列。使用方法はoracle.kafka.table.key.schemaと同様です。

oracle.kafka.table.extra.columns

オプション(デフォルトは"true")

追加のKafka列(paritionidoffsettimestamptype)を含めるかどうかを制御するブール・フラグ。

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に設定する必要があります。

2.1.6.2 Kafkaトピック用Oracle Big Data SQL表の作成

Big Data SQLでは、ORACLE_HIVEアクセス・ドライバの使用によって、Hiveメタデータを使用して説明されているKafkaソースを問い合せることができます。

Kafka用Hiveストレージ・ハンドラを使用してKafkaデータに基づくHive表を作成した後で、結果のHive表からBig Data SQL表を生成するための特別な手順はありません。Kafkaソース用のORACLE_HIVE設定は、他のHiveソースと同じです。次の例では、Oracle外部表の作成方法を示します。作成後、他のOracle表と同様にそれを問い合せることができます。

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

よくある質問

  • KafkaブローカへのOracle Big Data SQLアクセスは並列処理されますか。たとえば、Oracle Big Data SQLを実行しているノードが6つある場合、6つすべてのノードがKafkaへの1つの問合せに関与するため、Kafkaトピックを読み取るにはノード全体で1つのコンシューマ・グループを作成する必要がありますか。または、Kafkaから問合せを行うために1つのSELECT文に使用されるノードは1つのみですか。

    Big Data SQL問合せと同じく、Kafkaに対する問合せにはOracle Big Data SQLがインストールされているすべてのノードが関与します。

  • Kafka問合せでは、新しい着信データにどのように対応できますか。新しいデータがKafkaに送られるまで待機する問合せを設定できますか(タイムアウトを指定した場合)。

    新しいデータを取得するには、Oracle Big Data SQL問合せを定期的に実行し、新しい行(最後の読取り以降の行)のみを取得するようにオフセットおよびタイムスタンプでフィルタします。

関連項目:

Big Data SQL Quick Startというブログの次の項では、Oracle Big Data SQLからKafkaにアクセスする方法について詳しく説明しています - Big Data SQL Quick Start。Kafka経由のBig Data SQL - パート23

2.1.7 オブジェクト・ストア・アクセス用のOracle外部表の作成

ORACLE_BIGDATAアクセス・ドライバを使用すると、オブジェクト・ストアに格納されているデータを介して外部表を作成できます。Oracle Big Data SQLでは、現在、Oracle Object Store、Amazon S3およびAzure Blob Storageへのアクセスがサポートされています。

ORACLE_BIGDATAは、主にオブジェクト・ストアに対する問合せをサポートすることを目的としています。Smart ScanおよびOracle Big Data SQLセルを使用して、これらのストアに対するスケール・アウトおよびパフォーマンスを実現します。また、このドライバを使用すると、ローカル・データを問い合せることができます。これは、テスト用のデータ・セットや規模の小さなデータ・セットに便利です。

ORACLE_BIGDATAドライバは、rawファイルを介して表を作成するという点で、ORACLE_HDFSドライバに似ています。Hiveのようなメタデータ・ストアは使用しません。表定義の一部としてメタデータを指定します。

ただし、ORACLE_HDFSと異なり、ORACLE_BIGDATAはデータ・アクセスにJavaドライバおよび標準のHadoopメカニズム(SerDesやInputFormatsなど)を使用しません。ORACLE_BIGDATAは、すべてのデータ・アクセスに最適化されたCドライバを使用します。Avro、ORCおよびParquetファイル・タイプのテキストがサポートされています。テキスト・ファイル・タイプのサポートは堅牢です。たとえば、デリミタ付きテキストに対するパラメータを指定できます。また、Oracleの広範なJSON処理機能を使用することもできます。

オブジェクト・ストアのデータにアクセスする手順

オブジェクト・ストア内のデータにアクセスするには、次の2つの手順が必要です。
  • 資格証明オブジェクトの作成

    資格証明オブジェクトには、オブジェクト・ストア資格証明が暗号化された形式で格納されます。資格証明によって指定されたアイデンティティは、オブジェクト・ストア内の基礎となるデータにアクセスできる必要があります。

  • 型がORACLE_BIGDATAであるOracle Big Data SQL外部表の作成。CREATE TABLE文では、オブジェクト・ストアに対して認証を提供する資格証明オブジェクトを参照する必要があります。また、オブジェクト・ストア内のファイルへのURIを提供するLOCATION句も必要です。

資格証明オブジェクトの作成

資格証明オブジェクトを作成するには、DBMS_CREDENTIAL.CREATE_CREDENTIALプロシージャを使用します。このオブジェクトには、オブジェクト・ストアにアクセスするために必要なユーザー名とパスワード情報が含まれています。この資格証明パスワードは、クラウド・サービス内のユーザー名に対して作成された認証トークンと一致する必要があります。
execute dbms_credential.create_credential( 
   credential_name => '<my_credential>', 
   username        => '<username>', 
   password        => '<password>'
);
Native Oracle Cloud Infrastructureスタイルの資格証明の場合、オブジェクトには、オブジェクト・ストアにアクセスするためのキーも含まれます。このキーは、指定したユーザーのAPIキーと一致する必要があります。
execute dbms_credential.create_credential(
   credential_name => '<my_credential>',
   username => '<user_ocid>',
   password => '',
   key => '{"tenancy_ocid":"<tenancy_ocid>","private_key":"<private_key>","fingerprint":"<fingerprint>"}');

次に、com.oracle.bigdata.credential.nameパラメータで資格証明オブジェクト名を指定します。

関連項目:

Oracle Database PL/SQLパッケージおよびタイプ・リファレンスでは、DBMS_CREDENTIAL.CREATE_CREDENTIALの使用方法について説明しています。

LOCATION句の定義

LOCATIONは、オブジェクト・ストア内のデータを指すURIです。現在サポートされているオブジェクト・ストアは、Oracle Object StoreとAmazon S3です。URIの指定には、そのソースに応じて様々な方法があります。次にいくつかの例を示します。
  • Native Oracle Cloud Infrastructure Object Storageの場合、URI形式は次のとおりです。
    location ('https://objectstorage.<region>.oraclecloud.com/n/<namespace>/b/<bucket>/o/<objectname>')
  • Oracle Cloud Infrastructure Object Storageの場合、ファイルのURI形式は次のとおりです。
    location ('https://swiftobjectstorage.<region>.oraclecloud.com/v1/<namespace>/<bucket>/<filename>')
  • Amazon S3の場所については、https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-introを参照してください。

    ホストスタイルのURI形式は次のとおりです。

    location ('https://<bucket>.<host>/<objectname>')
    パススタイルのURI形式は次のとおりです。
    location ('https://<host>/<bucket>/<objectname>')
    使用可能なパススタイルの例を次に示します。
    location ('https://s3-us-west-2.amazonaws.com/adwc/<filename>')
  • Azure Blob Storageの場所については、URI形式は次のとおりです。
    location ('https://<host>:<port>/<container>/<blob>')
    次に例を示します。
    location ('https://myaccount.blob.core.windows.net/mycontainer/myblob')

資格証明オブジェクトは、オブジェクト・ストアへのアクセスのためにのみ必要となります。資格証明パラメータを省略する場合は、オブジェクトがパブリック・バケットにある必要があります。この資格証明に関連付けられているユーザーIDには、オブジェクト・ストレージからデータを読み取るためのアクセス権が必要です。

ローカル・ストレージを使用してオブジェクト・ストレージ内のデータへのアクセスをテストする場合は、ORACLE_LOADERデータ・ソースの場合と同じように、その場所にあるOracleディレクトリ・オブジェクトを指定する必要があります。

アクセス・パラメータの設定

ORACLE_HDFSと同様に、ORACLE_BIGDATAには、データへのアクセス方法と解析方法に関する情報が必要です。これを指定するには、アクセス・パラメータを使用します。ファイル形式のタイプを指定するには、次のアクセス・パラメータが必要です。
com.oracle.bigdata.fileformat={textfile|avro|parquet|orc}

デリミタ付きテキスト・ファイルの場合、rowformatパラメータも必要です。

関連項目:

このガイドのORACLE_BIGDATAアクセス・パラメータでは、共通のアクセス・パラメータと各ファイル・タイプに固有のアクセス・パラメータを表にまとめています。

ノート:

ORACLE_BIGDATAを使用すると、テストや単純な問合せ目的でローカル・ファイルにアクセスできます。この場合、LOCATIONフィールド値はORACLE_LOADERに使用するものと同じです。LOCATIONフィールドでは、Oracleディレクトリ・オブジェクトの後にファイルの名前を続けることができます。ローカル・ファイルの場合、資格証明オブジェクトは必須ではありません。ただし、ファイルにアクセスするには、ディレクトリ・オブジェクトに対する権限が必要です。

2.1.7.1 オブジェクト・ストア・アクセスの表の作成例

この項では、オブジェクト・ストアにアクセスするためのCREATE TABLE文の作成方法について説明します。

次の例に示すように、必要なコンポーネントは次のとおりです。

  • 外部表のスキーマ。

  • 資格証明オブジェクト。

  • ファイル形式パラメータおよびファイル形式に固有のアクセス・パラメータ。たとえば、デリミタ付きテキスト・ファイルにはrowformatパラメータが必要です。ParquetおよびAvroでは、fileformatパラメータのみが必要です。デフォルトのファイル形式はParquetです。

  • 特定のオブジェクト・ストアに対するLOCATION句の正しい構文。

  • オブジェクト・ストアではなく、ローカルなLOCATIONでDEFAULT DIRECTORY句を使用します。

関連項目:

各ファイル・タイプで使用可能なパラメータの詳細は、ORACLE_BIGDATAアクセス・パラメータを参照してください。

例: オブジェクト・ストア内のファイルへのアクセス

ノート:

オブジェクト・ストア・アクセスの場合、まずDBMS_CREDENTIAL PL/SQLパッケージのDBMS_CREDENTIAL.CREATE_CREDENTIALを使用して資格証明オブジェクトを作成する必要があります。
exec dbms_credential.create_credential(
credential_name => '<my_credential_object_name>',
username        => '<username>', 
password        => '<password>'
);

次に、文のACCESS PARAMETER句内で、文に示すようにオブジェクトの名前をcom.oracle.bigdata.credential.nameに割り当てます。この例のターゲットは、オブジェクト・ストアのParquetファイルです。

CREATE TABLE tkexbaseballtab
  (date1       date,
   date2       timestamp,
   name        varchar2(30),
   nationality varchar2(20),
   age         number,
   team        varchar2(20),
   active      char(1),
   average     float,
   payroll       char(1),
   exid        VARCHAR2(20))
  ORGANIZATION EXTERNAL
  (TYPE ORACLE_BIGDATA
   ACCESS PARAMETERS
   (
     com.oracle.bigdata.debug=TRUE
     com.oracle.bigdata.credential.name=MY_CRED
     com.oracle.bigdata.fileformat=parquet
   )
   location ('https://<domain>.com/BIGDATA_PARQUET/<filename>.parquet')
  )  REJECT LIMIT UNLIMITED;
2.1.7.2 Oracleディレクトリ・オブジェクトを介したローカル・ファイルへのアクセス

ORACLE_BIGDATAドライバを使用して、ローカル・ファイルに対する外部表を作成することもできます。

次の文では、ローカル・ディレクトリ内のテキスト・ファイルに対する外部表を作成しています。JSONファイルの場合、ファイル形式をtextfileに設定します。それ以外のアクセス・パラメータは必要ありません。ローカル・ファイルにアクセスするときに資格証明を提示する必要はありません。デリミタ付きテキスト・ファイルの場合と同様ですが、ファイルに使用されているフィールドや行の終端文字がデフォルト以外の値である場合はそれらも定義します。この例では、フィールドの終端文字を縦線(|)に設定しています。この文には、DEFAULT DIRECTORY句は含まれません。かわりに、LOCATION句には、ファイルが存在するディレクトリ・オブジェクトの名前(DEF_DIR1)を指定します。

CREATE TABLE b19724081
(    CONTRACT_STATUS_CODE VARCHAR2(1),
     CONTRACT_STATUS_DESCRIPTION VARCHAR2(200),
     POSTING_AGENT VARCHAR2(50),
     DATA_ORIGIN VARCHAR2(50),
     WAREHOUSE_POSTING_TIMESTAMP DATE,
     WAREHOUSE_UPDATE_TIMESTAMP DATE
)
ORGANIZATION EXTERNAL
  ( TYPE ORACLE_BIGDATA
    DEFAULT DIRECTORY "DEF_DIR1"
    ACCESS PARAMETERS
    (
      com.oracle.bigdata.fileformat=textfile
      com.oracle.bigdata.csv.rowformat.fields.terminator = '|'
    )
  location ("DEF_DIR1":"<'filename>.csv')
  )
REJECT LIMIT UNLIMITED;
2.1.7.3 Oracleデータ型への変換

Oracle Big Data SQLでは、Parquet、ORCおよびAvroファイル・データ型からOracleデータ型への変換がサポートされていますが、スカラー・フィールドのみにかぎられます。非スカラー・データ型はVARCHAR2(4000)に変換されます。

配列や構造体などの複合型はVARCHAR2データ型にマップされ、VARCHAR2フィールドでJSON文字列で表されます。

ノート:

列のデータに変換エラーが発生した場合、たとえば、変換された値を保持するのに十分な大きさがターゲット列にない場合、列の値はNULLに設定されます。

表2-6 Parquet、ORCおよびAvroデータ型からOracleデータ型へのORACLE_BIGDATAマッピング

型の説明 Parquet ORC Avro サポートされているOracleデータ型への変換
10進数: スケールなし×スケール10の形式の任意精度符号付き10進数

1decimal (int32、int64、fixed_len_byte_array、byte_array)

2decimal (int64、int128) 3decimal (bytes、fixed)

number(p)、

number(p,s)

UTF8: UTF-8でエンコードされた文字列

string/utf8

char/string/varchar string

varchar2

バイト配列/バイナリ

4byte_array

binary bytes

blob

固定長のバイト配列

fixed_len_byte_array

- fixed

blob

UUID

UUID (fixed_len_byte_array)

- -

blob

Json

JSON (byte_array)

- - varchar2

2

Bson

Bson (byte_array)

- -

-

日付: Unixエポック1970年1月1日からの日数 date (int32) date date (int) date
時間(ミリ): 深夜00: 00: 00.000以降のミリ秒数 time-millis (int32) - time-millis (int) timestamp(3)
時間(マイクロ): 深夜00:00:00.000000以降のマイクロ秒数 time-micros (int64) - time-micros (long) timestamp(6)
時間(ナノ): 深夜00:00:00.000000以降のナノ秒数 time-nanos (int64) - - timestamp(9)
時間(ミリ) UTC time-millis-UTC (int32) - - timestamp(3)
時間(マイクロ) UTC time-micros-UTC (int64) - - timestamp(6)
時間(ナノ) UTC time-nanos-UTC (int64) - - timestamp(9)
timestamp (millis) timestamp-millis (int64) - - timestamp(3)
timestamp (micros) timestamp-micros (int64) - - timestamp(6)
timestamp (nanos) timestamp-nanos (int64) timestamp - timestamp(9)
タイムスタンプ(ミリ) UTC: unixエポック1970年1月1日00:00:00.000 UTCからのミリ秒数 timestampmillis-UTC (int64) - timestampmillis (long) timestamp(3)
タイムスタンプ(マイクロ) UTC: unixエポック1970年1月1日00:00:00.000000 UTCからのマイクロ秒数 timestampmicros-UTC (int64) - timestampmicros (long) timestamp(6)
タイムスタンプ(ナノ) UTC: unixエポック1970年1月1日00:00:00.000000 UTCからのナノ秒数 timestampnanos-UTC (int64) - - timestamp(9)
期間: 月数、日数およびミリ秒数 interval (fixed、size: 12) - duration(fixed、size:12) -
8ビットの符号付き整数 int_8 (int32) - - number(3)、tinyint
16ビットの符号付き整数 int_16 (int32) - - number(5)、smallint
32ビットの符号付き整数 int_32 (int32) - int number(10)、int
64ビットの符号付き整数 int_64 (int64) - long number(20)、bigint
8ビットの符号なし整数 uint_8 (int32) byte - number(3)、tinyint
16ビットの符号なし整数 uint_16 (int32) short - number(5)、smallint
32ビット符号なし整数 uint_32 (int32) int - number(10)、int
64ビットの符号なし整数 uint_64 (int64) long - number(20)、bigint
96ビットの符号付き整数 5int96 - - number(29)、timestamp(9)
IEEE 32ビットの浮動小数点 float float float binary_float
IEEE 64ビットの浮動小数点 double double double binary_double
ブール boolean boolean boolean number(1)
null/値なし null - null varchar2(1)
列挙 enum(int) - enum(int) varchar2
  1. Parquetでは、10進数は、固定長のバイト配列、またはサイズが精度で決定されるバイト配列として、int_32、int_64で格納できます。
  2. ORCでは、10進数は128ビットの整数で格納されます。
  3. Avroでは、10進数はバイト配列(固定または非固定)として内部的に格納されます。Avroライターによっては、10進数の文字列表現が格納される場合や、スケールなしの値が格納される場合があります。ユーザーにあいまいなデータが表示されるのを避けるために、アクセス・パラメータcom.oracle.bigdata.avro.decimaltpeを使用して、ファイル内で使用される表現を明示的に宣言することをお薦めします。このパラメータが明示的に指定されていない場合は、ファイルの10進数列にデータのスケールなし表現が格納されると見なされます。ORACLE_BIGDATAアクセス・パラメータを参照してください。
  4. Parquetのbinary型は、com.oracle.bigdata.prq.binary_as_stringFALSEに設定されている場合のみblobとして使用できます。ORACLE_BIGDATAアクセス・パラメータを参照してください。
  5. Parquetのint_96型は、com.oracle.bigdata.prq.int96_as_timestampアクセス・パラメータがFALSEに設定されている場合のみnumberとして使用できます。ORACLE_BIGDATAアクセス・パラメータを参照してください。
2.1.7.4 ORACLE_BIGDATAでの圧縮ファイルのサポート

オブジェクト・ストア内の圧縮されたファイルにアクセスするためのORACLE_BIGDATAドライバのサポートは、次のとおりです。

  • 圧縮されたテキスト、Parquet、AvroおよびORCファイル

    このドライバでは、gzip、bzip2またはzlibで圧縮されたテキスト、Parquet、AvroおよびORCファイルから読み取ることができます。圧縮形式は、自動的に検出するか、指定することができます。外部表作成の文では、圧縮ファイルを処理するためのパラメータは必要ありません。

    次のORACLE_BIGDATAアクセス・パラメータを使用して圧縮タイプを定義します。
    com.oracle.bigdata.compressiontype=detect|gzip|zlib|bzip2
    gzip圧縮タイプの定義例は次のとおりです。
    com.oracle.bigdata.compressiontype=gzip

    詳細は、ORACLE_BIGDATAアクセス・パラメータを参照してください。

2.2 外部表の問合せ

ユーザーは、他の表を問い合せる場合と同じように、SQL SELECT文を使用して外部表を問い合せることができます。

ノート:

MODIFY EXTERNAL句は、ORACLE_BIGDATAドライバで作成された外部表では許可されません。

2.2.1 ユーザー・アクセス権の付与

Hadoopクラスタ上のデータを問い合せるユーザーには、外部表、およびクラスタ・ディレクトリを指すデータベース・ディレクトリ・オブジェクトへのOracle Database内のREADアクセス権が必要です。「クラスタ・ディレクトリについて」を参照してください。

2.2.2 エラー処理について

デフォルトでは、列の値を計算しているときにエラーが発生した場合、問合せはデータを返しません。ほとんどのエラー(特に、列の値を計算中にスローされたエラー)の後も処理は続行します。

エラーの処理方法を決定するには、com.oracle.bigdata.erroroptパラメータおよびcom.oracle.bigdata.overflowパラメータを使用します。

2.2.3 ログ・ファイルについて

次のアクセス・パラメータを使用すると、ログ・ファイルをカスタマイズできます。

2.2.4 ファイル・リーダーについて

2.2.4.1 OracleによってHadoopソース用に最適化されたParquetリーダーの使用

Parquetファイルの読取りの場合は、Hadoopソース用のカスタムParquetリーダーを使用することもできます。このような固有のドライバによってパフォーマンスが向上し、クラスタ・リソースをより効率的に使用できます。

カスタム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-toolsについてヘルプを実行します。CDH Hadoopディストリビューションでは、parquet-toolsコマンドをパスに構成することもできます。

次の例では、sales.parqというファイルに対してParquetツールを実行する方法を示します。
parquet-tools meta sales.parq

この結果の出力には、各列に最小値、最大値、およびNull値の数が含まれます。

c_quantity : ... :[min: 0, max: 109572, num_nulls: 55]c.total_sales : ... :[min: 0, max: 109571, num_nulls: 41]

2.3 データベース・サーバー(Oracle Exadata Machineなど)上のOracle Big Data SQLについて

この項では、Oracle Big Data SQLインストールによってOracle Databaseシステム(Oracle Exadata Machineなど)に加えられる変更について説明します。

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

2.3.1 bigdata_configディレクトリについて

bigdata_configディレクトリには、すべてのHadoopクラスタに共通の構成情報が含まれています。このディレクトリは、Oracle Databaseシステムの$ORACLE_HOME/bigdatasqlの下にあります。oracleファイル・システムのユーザー(またはOracle Databaseインスタンスを所有するユーザー)は、bigdata_configを所有します。Oracleデータベース・ディレクトリORACLE_BIGDATA_CONFIGbigdata_configを指します。

2.3.2 一般的な構成プロパティ

インストールで、これらのファイルは$ORACLE_HOME/bigdatasqlの下のbigdata_configディレクトリ内に格納されます。

Oracle DBAは、必要に応じてこれらの構成ファイルを編集できます。

2.3.2.1 bigdata.properties

共通ディレクトリ内の 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共有ライブラリ(libjvm.soなど)への完全なファイル・パス。必須。

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ネイティブ・ライブラリを検索するためのディレクトリ・パスのコロン区切りの(:)リスト。推奨。

このオプションを設定した場合は、java.optionsjava.libraryパスを設定しないでください。

例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
2.3.2.2 bigdata-log4j.properties

共通ディレクトリの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

関連項目:

Apacheロギング・サービスのドキュメントの場所:

http://logging.apache.org/log4j/1.2/manual.html

2.3.3 クラスタ・ディレクトリについて

クラスタ・ディレクトリには、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は、デフォルト・クラスタのディレクトリへのソフト・リンクです。

データベース・ディレクトリ・オブジェクトはクラスタ・ディレクトリを指します。クラスタ内のデータにアクセスするユーザーには、ディレクトリ・オブジェクトの読取りアクセス権が必要です。

2.3.4 権限について

Oracle Databaseサーバーで、oracleユーザー(またはOracle Databaseインストール・ディレクトリを所有するユーザー)は、データベース・ディレクトリ(ログ・ディレクトリを指す)に対するREAD/WRITEアクセス権を持っている必要があります。

Hadoop側では、Database Acknowledge (# ./jaguar databaseack [config file])を実行すると、この操作によりデータベース所有者のアカウントが作成され、必要な権限が付与されます。