ヘッダーをスキップ
Oracle® Big Data Connectorsユーザーズ・ガイド
リリース2 (2.5)
E53261-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

xml_table

XML値を表の1行以上の行にマップするか、または表の行にマップしないユーザー定義の表生成関数(UDTF)。この関数を使用すると、XMLのネストされた繰返し要素をHive表の行にマップできます。

シグネチャ

xml_table( 
   STRUCT? namespaces,
   STRING query, 
   {STRUCT | STRING} bindings,
   STRUCT? columns
) 

説明

namespaces

問合せおよび列の式で使用できるネームスペースを指定します。オプション。

値は、偶数個のSTRINGフィールドで構成されるSTRUCTです。フィールドの各ペアで、問合せまたは列の式で使用されるネームスペース・バインディング(接頭辞, URI)が定義されます。例3を参照してください。

query

返される各値に対する表の行を生成するXQueryまたはXPath式。これは、関数が最初に評価されるときのみ読み込まれるため、定数値である必要があります。最初の問合せ文字列がコンパイルされ、後続のすべての呼出しで再使用されます。

問合せ処理時に動的エラーが発生した場合、関数でエラーは発生しませんが、最初はエラーがログに記録されます。後続の動的エラーはログに記録されません。

bindings

問合せで処理される入力。値は、XML STRINGまたは変数値のSTRUCTです。

  • STRING: 文字列は、問合せの初期コンテキスト項目にXMLとしてバインドされます。例1を参照してください。

  • STRUCT: 偶数個のフィールドで構成されるSTRUCT。フィールドの各ペアで、問合せの変数バインディング(名前, )が定義されます。名前フィールドのタイプはSTRINGである必要があり、値フィールドにはサポートされているプリミティブを指定できます。「データ型変換」を参照してください。

columns

生成される行の列を定義するXQueryまたはXPath式。オプション。

値は、追加のXQuery式を含むSTRUCTです。XQuery式は、関数が最初に評価されるときのみ読み込まれるため、定数のSTRING値である必要があります。STRUCTの各列式に対して、表に1つの列があります。

問合せで返される各項目に対して、式の初期コンテキスト項目として現在の項目で列式が評価されます。列式の結果はSTRING値に変換され、行の値になります。

列式の結果が空の場合、または列式の評価時に動的エラーが発生した場合、対応する列値はNULLです。列式で複数の項目が返される場合、最初の項目以外はすべて無視されます。

columns引数の省略は、'struct(".")'と指定することと同じです。例2を参照してください。

戻り値

query引数で返される各項目に対する1行の表の行。

注意

XML表アダプタを使用すると、HDFSの大規模なXMLファイルに関するHive表を作成できます。「XML表に対するHiveのCREATE TABLE構文」を参照してください。

例1   STRINGバインディングの使用

問合せ"x/y"は、2つの<y>要素を返すため、表の行が2行生成されます。2つの列式("./z", "./w")があるため、各行は2列です。

hive> SELECT xml_table(
   "x/y",
   "<x>
      <y>
         <z>a</z>
         <w>b</w>
      </y>
      <y>
         <z>c</z>
      </y>
   </x>
   ",
   struct("./z", "./w")
 ) AS (z, w)
 FROM src;
     .
     .
     .
a        b
c        NULL
例2   columns引数の使用

次の2つの問合せは同等です。最初の問合せでは、columns引数の値が明示的に指定されています。

hive> SELECT xml_table(
      "x/y",
      "<x><y>hello</y><y>world</y></x>",
      struct(".")
   ) AS (y)
   FROM src;
     .
     .
     .
hello
world

2番目の問合せではcolumns引数が省略されており、デフォルトでstruct(".")に設定されます。

hive> SELECT xml_table(
      "x/y",
      "<x><y>hello</y><y>world</y></x>"
   ) AS (y)
   FROM src;
     .
     .
     .
hello
world
例3   namespaces引数の使用

次の例では、ns接頭辞とURI http://example.orgを指定する、オプションのnamespaces引数を指定します。

hive> SELECT xml_table(
     struct("ns", "http://example.org"),
     "ns:x/ns:y",
     "<x xmlns='http://example.org'><y><z/></y><y><z/><z/></y></x>",
     struct("count(./ns:z)")
  ) AS (y)
  FROM src;
     .
     .
     .
1
2
例4   XMLドキュメントのHive表の問合せ

次の例では、タイプがSTRINGXML_STRという単一の列がある、COMMENTSという表を問い合せます。次の3行が含まれています。

hive> SELECT xml_str FROM comments3;

<comment id="12345" user="john" text="It is raining:("/>
<comment id="56789" user="kelly" text="I won the lottery!"><like user="john"/><like user="mike"/></comment>
<comment id="54321" user="mike" text="Happy New Year!"><like user="laura"/></comment>

次の問合せは、COMMENTS表からユーザー、テキストおよびlikeの数を抽出する方法を示しています。

hive> SELECT t.id, t.usr, t.likes
     FROM comments3 LATERAL VIEW xml_table(
        "comment",
        comments.xml_str, 
        struct("./@id", "./@user", "fn:count(./like)")
     ) t AS id, usr, likes;

12345   john    0
56789   kelly   2
54321   mike    1

注意:

xml_query_as_string関数を使用すると、この例で同じ結果を得ることができます。ただし、xml_tableは、単一の関数呼出しで3つの列値すべてを設定し、各行に対する入力XMLの解析が1回のみであるため、より効率的です。xml_query_as_string関数では、3つの列それぞれに対して別々の関数呼出しが必要であり、同じ入力XML値が毎回再解析されます。

例5   ネストされたXML要素の表の行へのマッピング

次の例は、xml_tableを使用して、ネストされた繰返しXML要素を表の行にフラット化する方法を示しています。COMMENTS表は、例4を参照してください。

> SELECT t.i, t.u, t.l
    FROM comments3 LATERAL VIEW xml_table (
       "let $comment := ./comment
        for $like in $comment/like
        return
           <r>
              <id>{$comment/@id/data()}</id>
              <user>{$comment/@user/data()}</user>
              <like>{$like/@user/data()}</like>
           </r>
       ",
       comments.xml_str,
       struct("./id", "./user", "./like")
    ) t AS i, u, l;

56789   kelly   john
56789   kelly   mike
54321   mike    laura
例6   オプションのネストされたXML要素の表の行へのマッピング

次の例は、例5を少し変更したもので、コメントにlikeがない場合でも行を生成します。COMMENTS表は、例4を参照してください。

> SELECT t.i, t.u, t.l
     FROM comments3 LATERAL VIEW xml_table (
        "let $comment := ./comment
         for $like allowing empty in $comment/like
         return 
            <r>
               <id>{$comment/@id/data()}</id>
               <user>{$comment/@user/data()}</user>
               <like>{$like/@user/data()}</like>
            </r>
        ",
        comments.xml_str, 
        struct("./id", "./user", "./like")
     ) t AS i, u, l;

12345   john
56789   kelly   john
56789   kelly   mike
54321   mike    laura
例7   新規ビューの作成

表生成関数と同じxml_tableを使用して、ビューおよび新規の表を作成できます。次の例では、COMMENTS表からCOMMENTS_LIKESという新しいビューを作成します。

hive> CREATE VIEW comments_likes AS 
     SELECT xml_table(
        "comment", 
         comments.xml_str, 
         struct("./@id", "count(./like)")
     ) AS (id, likeCt)
     FROM comments;

次の例では、新しいビューを問い合せます。

> SELECT * FROM comments_likes
     WHERE CAST(likeCt AS INT) != 0;

56789   2
54321   1
例8   Hadoop分散キャッシュへのアクセス

fn:docおよびfn:unparsed-text関数を使用して、分散キャッシュに追加されたXMLドキュメントとテキスト・ファイルにアクセスできます。

次の例では、次の文字列を含むtest.xmlというファイルを問い合せます。

<x><y>hello</y><z/><y>world</y></x>
hive> ADD FILE test.xml;
Added resource: test.xml
hive> SELECT xml_table("fn:doc('test.xml')/x/y", NULL) AS y FROM src;
     .
     .
     .
hello
world