XML値を表の1行以上の行にマップするか、または表の行にマップしない表生成関数(UDTF)。この関数を使用すると、XMLのネストされた繰返し要素をHive表の行にマップできます。
説明
問合せおよび列の式で使用できるネームスペースを指定します。オプション。
値は、偶数個のSTRING
フィールドで構成されるSTRUCT
です。フィールドの各ペアで、問合せまたは列の式で使用されるネームスペース・バインディング(接頭辞, URI)が定義されます。例3を参照してください。
返される各値に対する表の行を生成するXQueryまたはXPath式。これは、関数が最初に評価されるときのみ読み込まれるため、定数値である必要があります。最初の問合せ文字列がコンパイルされ、後続のすべての呼出しで再使用されます。
問合せ処理時に動的エラーが発生した場合、関数でエラーは発生しませんが、最初はエラーがログに記録されます。後続の動的エラーはログに記録されません。
問合せで処理される入力。値は、XML STRING
または変数値のSTRUCT
です。
STRING
: 文字列は、問合せの初期コンテキスト項目にXMLとしてバインドされます。例1を参照してください。
STRUCT
: 偶数個のフィールドで構成されるSTRUCT
。フィールドの各ペアで、問合せの変数バインディング(名前, 値)が定義されます。名前フィールドのタイプはSTRING
である必要があり、値フィールドにはサポートされているプリミティブを指定できます。「データ型変換について」を参照してください。
生成される行の列を定義するXQueryまたはXPath式。オプション。
値は、追加のXQuery式を含むSTRUCT
であり、行の列値を定義します。XQuery式は、関数が最初に評価されるときのみ読み込まれるため、定数のSTRING
値である必要があります。STRUCT
の各列式に対して、表に1つの列があります。
問合せで返される各項目に対して、式の初期コンテキスト項目として現在の項目で列式が評価されます。列式の結果はSTRING
値に変換され、行の値になります。
列式の結果が空の場合、または列式の評価時に動的エラーが発生した場合、対応する列値はNULL
です。列式で複数の項目が返される場合、最初の項目以外はすべて無視されます。
columns引数の省略は、'struct(".")'
と指定することと同じです。例2を参照してください。
例
問合せ"x/y"は、2つの<y>
要素を返すため、表の行が2行生成されます。2つの列式("./z", "./w")があるため、各行は2列です。
> 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引数の値が明示的に指定されています。
> SELECT xml_table( "x/y", "<x><y>hello</y><y>world</y></x>", struct(".") ) AS (y) FROM src; hello world
2番目の問合せではcolumns引数が省略されており、デフォルトでstruct(".")
に設定されます。
> SELECT xml_table( "x/y", "<x><y>hello</y><y>world</y></x>" ) AS (y) FROM src; hello world
次の例では、ns
接頭辞とURI http://example.org
で構成される、オプションのネームスペース引数を指定します。
> 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
次の例では、タイプがSTRING
のXML_STR
という単一の列がある、COMMENTS
という表を問い合せます。次の3行が含まれています。
> SELECT xml_str FROM comments;
<comment id="12345" user="john" text="It is raining:("/>
<comment id="56789" user="kelly" text="I won the lottery!"><like user="john"/><like user="mike"/></comment>
<comment id="54321" user="mike" text="Happy New Year!"><like user="laura"/></comment>
次の問合せは、COMMENTS
表からユーザー、テキストおよびlikeの数を抽出する方法を示しています。
> SELECT t.id, t.usr, t.likes FROM comments 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値が毎回再解析されます。 |
次の例は、xml_table
を使用して、ネストされた繰返しXML要素を表の行にフラット化する方法を示しています。COMMENTS
表は、例4を参照してください。
> SELECT t.i, t.u, t.l FROM comments 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
次の例は、例5を少し変更したもので、コメントにlikeがない場合でも行を生成します。COMMENTS
表は、例4を参照してください。
> SELECT t.i, t.u, t.l FROM comments 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
表生成関数と同じxml_table
を使用して、ビューおよび新規の表を作成できます。次の例では、COMMENTS
表からCOMMENTS_LIKES
という新しいビューを作成します。
> 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
fn:doc
およびfn:unparsed-text
関数を使用して、分散キャッシュに追加されたXMLドキュメントとテキスト・ファイルにアクセスできます。
次の例では、次の文字列を含むtest.xmlというファイルを問い合せます。
"<x><y>hello</y><z/><y>world</y></x>"
> ADD FILE test.xml; > SELECT xml_table("fn:doc('test.xml')/x/y", NULL) AS y FROM src; hello world