1.6 キャラクタ・ラージ・オブジェクト(CLOB)処理のプッシュダウンについて

Hadoopデータに対する問合せには、レコード数が数百万になる可能性があるラージ・オブジェクトの処理を伴うことがあります。こうしたオブジェクトをフィルタ処理や解析のためにOracle Databaseに戻すことは非効率です。Oracle Big Data SQLでは、Hadoopクラスタ上の専用処理セルにCLOBの処理をプッシュ・ダウンすることで大幅なパフォーマンス向上を実現できます。Hadoopでフィルタ処理すると、Oracle Databaseに戻す行の数が少なくなります。解析することで、フィルタ処理した各行内の列から返されるデータの量が少なくなります。

CLOB処理はユーザーのニーズに適合するように無効化または再有効化できます。

現在のリリースでは、この機能は現時点でCLOBデータを返すJSON式にのみ適用されます。ストレージ・レイヤーの評価に適格なJSONフィルタ式には、単純化された構文のJSON_VALUEおよびJSON_QUERYが含まれます。

将来のリリースでは、その他のCLOB型(substrやinstrなど)に加えてBLOBデータにも同じサポートが提供されます。

Oracle Big Data SQLは、次に示すサイズ制約の範囲内で、HadoopにCLOBの処理をプッシュ・ダウンできます。

  • CLOB列のフィルタリングは最大サイズが1 MB。

    ストレージ・サーバーでの評価に利用できる実際のデータ量は、使用される文字セットに応じて異なることがあります。

  • 列の解析は最大32 KB。

    この制限は、CLOBデータ型のストレージからの選択リストの投影を表します。

列のサイズがこれらの2つの値を超える場合にのみ、処理がOracle Databaseに戻されます。

例1-3 JSONドキュメントの処理

大きなJSONドキュメントへの問合せでは、HadoopのOracle Big Data SQL処理セルにCLOB処理をプッシュダウンすることで効率が大幅に向上します。次の例では、購入オーダー情報がJSONで保存されています。このレコードの最大サイズは25Kで、数百万件のレコードの処理が必要になるとします。
{"ponumber":9764,"reference":"LSMITH-20141017","requestor":"Lindsey Smith","email”: “Lindsey@myco.com”, “company”:”myco” …}
次に示すように、このデータにアクセスする外部表を作成できます。単一のCLOB列がある点に注目してください。
CREATE TABLE POS_DATA
  ( pos_info CLOB )
  ORGANIZATION EXTERNAL
  ( TYPE ORACLE_HDFS
    DEFAULT DIRECTORY DEFAULT_DIR
    LOCATION ('/data/pos/*')
  )
 REJECT LIMIT UNLIMITED;
このようにすると、次の単純な構文でデータを問い合せることができます。
SELECT p.pos_info.email, p.pos_info.requestor
FROM POS_DATA p
WHERE p.pos_info.company=’myco’

この問合せ例では、次の2つのデータ除外の最適化が実施されます。

  • データは、Hadoopクラスタ内のOracle Big Data SQLセルでフィルタ処理されます。「myco」という会社に関連するレコードのみが解析されます(解析後、該当するレコードから選択されたデータのみがデータベースに返されます)。

  • クラスタ内のOracle Big Data SQLセルは、フィルタ処理されたレコードのセットを解析して、各レコードから要求された2つの属性(p.pos_info.emailp.pos_info.requestor)の値のみがデータベースに返されます。

次の表では、CLOB処理のプッシュダウンがサポートされる別の例を示します。前述したように、投影(CLOB列の選択側のリファレンス)は32 KBのCLOBデータに制限されていて、述語のプッシュダウンは1 MBのCLOBデータに制限されています。

問合せ コメント
SELECT count(*) FROM pos_data p WHERE pos_info is json; この場合、述語によりJSON形式に準拠する列のみが返されるようになります。
SELECT pos_info FROM pos_data p WHERE pos_info is json; 前の場合と同じ述語ですが、CLOB値が投影されるようになっています。
SELECT json_value(pos_info, '$.reference') FROM pos_data p WHERE json_value(pos_info, '$.ponumber') > 9000 ここでは、述語はJSONドキュメントのフィールドに対して発行されます。また、投影されたCLOB JSON値の上部にあるフィールド"reference"を取得するJSON値も実行しています。
SELECT p.pos_info.reference FROM pos_data p WHERE p.pos_info.ponumber > 9000; これは前の例と同様に機能しますが、簡略化された構文で表現されています。
SELECT p.pos_info.email FROM po_data p WHERE json_exists(pos_info, '$.requestor') and json_query(pos_info, '$.requestor') is not null; この例は、述語としてjson_existsjson_queryも使用できるようにする方法を示しています。