この章では、Oracle XQuery for Hadoopで提供される、XML Extensions for Apache Hiveの使用方法について説明します。この章の内容は次のとおりです。
XML Extensions for Hiveでは、次のことを可能にするXML処理サポートが提供されています。
HDFSの大規模なXMLファイルのHive表としての問合せ
Hive表のXML文字列の問合せ
Hadoop分散キャッシュのXMLファイル・リソースの問合せ
高負荷DOM解析を使用せずにXMLからアトミック値を効率的に抽出
複雑なXML要素の取得、生成および変換
単一XML値からの表の複数行の生成
XMLでの欠落およびダーティ・データの管理
XML拡張では、次の各W3C最新標準もサポートされています。
XQuery 3.1
XQuery Update Facility 1.0 (変換式)
XPath 3.1
XML Schema 1.0
XML Namespaces
XML拡張には2つのコンポーネントがあります。
XML表を作成するためのXML InputFormatおよびSerDe
「XML表の作成」を参照してください。
XML関数ライブラリ
「Hive関数について」を参照してください。
Oracle XQuery for Hadoop拡張を有効にするには、Hiveの起動時に--auxpath
および-i
引数を使用します。
$ hive --auxpath \ $OXH_HOME/hive/lib/oxh-hive.jar,\ $OXH_HOME/hive/lib/oxh-mapreduce.jar,\ $OXH_HOME/hive/lib/oxquery.jar,\ $OXH_HOME/hive/lib/xqjapi.jar,\ $OXH_HOME/hive/lib/apache-xmlbeans.jar,\ $OXH_HOME/hive/lib/woodstox-core-asl-*.jar,\ $OXH_HOME/hive/lib/stax2-api-*.jar \ -i $OXH_HOME/hive/init.sql
注意:
Oracle BigDataLite VMでは、HIVE_AUX_JARS_PATH
はHive拡張をデフォルトで含み、そのため--auxpath
を指定する必要はありません。
拡張を初めて使用するとき、それらがアクセス可能であることを確認します。次の手順では、SRC
という表を作成し、その表に1行ロードした後、xml_query
関数を呼び出します。
拡張がアクセス可能であることを確認するには、次の手順を実行します。
作業しようとしているHadoopクラスタにあるサーバーにログインします。
Hiveコマンドライン・インタフェース(CLI)を起動します。
$ hive --auxpath \ $OXH_HOME/hive/lib/oxh-hive.jar,\ $OXH_HOME/hive/lib/oxh-mapreduce.jar,\ $OXH_HOME/hive/lib/oxquery.jar,\ $OXH_HOME/hive/lib/xqjapi.jar,\ $OXH_HOME/hive/lib/apache-xmlbeans.jar,\ $OXH_HOME/hive/lib/woodstox-core-asl-*.jar,\ $OXH_HOME/hive/lib/stax2-api-*.jar \ -i $OXH_HOME/hive/init.sql
init.sql
ファイルには、XML関数を宣言するCREATE TEMPORARY FUNCTION
文が含まれています。
Hive用のOracle XQuery for Hadoop関数を呼び出します。この例では、xml_query
関数を呼び出してXML文字列を解析します。
hive> SELECT xml_query("x/y", "<x><y>123</y><z>456</z></x>");
.
.
.
["123"]
拡張がアクセス可能な場合は、例に示すように、問合せで["123"]
が返されます。
HIVE_AUX_JARS_PATH
および構成プロパティhive.aux.jars.path
に次のJARを追加する必要があります。$OXH_HOME/hive/lib/woodstox-core-asl-*.jar $OXH_HOME/hive/lib/apache-xmlbeans.jar $OXH_HOME/hive/lib/oxh-hive.jar $OXH_HOME/hive/lib/oxh-mapreduce.jar $OXH_HOME/hive/lib/stax2-api-*.jar $OXH_HOME/hive/lib/xqjapi.jar $OXH_HOME/hive/lib/oxquery.jar
関連項目:
前の例で示したように、init.sql
を使用して関数を一時的に宣言できます。それらを永続的に宣言することもできます。
Oracle XQuery for Hadoopの拡張を使用すると、Hadoop分散キャッシュのHive表およびXMLファイル・リソース内のXML文字列を問い合せることができます。これらは次の関数です。
xml_query
: 問合せの結果をSTRING
値の配列として返します。
xml_query_as_primitive
: 問合せの結果をHiveプリミティブ値として返します。各Hiveプリミティブ・データ型には、それに対応する名前の個別の関数があります。
xml_exists
: 問合せの結果が空かどうかをテストします。
xml_table
: XML値をゼロ以上の表の行にマップします。この関数を使用すると、XMLのネストされた繰返し要素をHive表の行にマップできます。
「Hive用のOracle XML関数のリファレンス」を参照してください。
前の項の例では、Hive関数のXML拡張を一時的に宣言するために$OXH_HOME/hive/init.sql
が使用されていました。ただし、代替手段として、init.sql
が不要なように関数を永続的に宣言できます。関数を永続的に宣言するには、次のコマンドを使用します。
CREATE FUNCTION xml_query AS 'oracle.hadoop.xquery.hive.OXMLQueryUDF' ; CREATE FUNCTION xml_query_as_bigint AS 'oracle.hadoop.xquery.hive.OXMLQueryBigintUDF' ; CREATE FUNCTION xml_query_as_int AS 'oracle.hadoop.xquery.hive.OXMLQueryIntUDF' ; CREATE FUNCTION xml_query_as_smallint AS 'oracle.hadoop.xquery.hive.OXMLQuerySmallintUDF' ; CREATE FUNCTION xml_query_as_tinyint AS 'oracle.hadoop.xquery.hive.OXMLQueryTinyintUDF' ; CREATE FUNCTION xml_query_as_float AS 'oracle.hadoop.xquery.hive.OXMLQueryFloatUDF' ; CREATE FUNCTION xml_query_as_double AS 'oracle.hadoop.xquery.hive.OXMLQueryDoubleUDF' '; CREATE FUNCTION xml_query_as_boolean AS 'oracle.hadoop.xquery.hive.OXMLQueryBooleanUDF' ; CREATE FUNCTION xml_query_as_string AS 'oracle.hadoop.xquery.hive.OXMLQueryStringUDF' ; CREATE FUNCTION xml_exists AS 'oracle.hadoop.xquery.hive.OXMLExists' ; CREATE FUNCTION xml_table AS 'oracle.hadoop.xquery.hive.OXMLTableUDTF' ;
この項では、HiveのCREATE TABLE
文を使用して大規模なXMLドキュメントに関する表を作成する方法を説明します。
XML表に関するHive問合せは、MapReduceフレームワークでXMLを並列で処理できるようにOracle XQuery for HadoopによってXMLが分割されるため、適切な規模で行われます。
スケーラブルな処理をサポートし、MapReduceフレームワークで動作するために、表アダプタによって、表の行の作成に使用する要素がスキャンされます。表の一部であると識別した要素のみが解析され、残りのXMLは無視されます。したがって、XML表アダプタでは、入力XMLに制限が課される、XMLドキュメント全体の真の意味での解析は実行されません。これらの制限のため、「XQuery変換の要件」にリストされている制約を満たすXMLドキュメントに関してのみ表を作成できます。それ以外の場合は、エラーが発生するか、誤った結果となる場合があります。
次に、XMLファイルに関するHive表を作成するためのHiveのCREATE TABLE
文の基本構文を示します。
CREATE TABLE table_name (columns) ROW FORMAT SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe' STORED AS INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat' OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat' TBLPROPERTIES(configuration)
パラメータ
パラメータ | 説明 |
---|---|
columns |
XML表の列タイプはすべて、「データ型変換」で示されているHiveプリミティブ・タイプの1つである必要があります。 |
configuration |
「CREATE TABLE構成プロパティ」で説明されているいずれかのプロパティ。複数のプロパティはカンマで区切ります。 |
注意:
XML表へのデータの挿入はサポートされていません。
次の構成プロパティは、CREATE TABLE
コマンドのconfiguration
パラメータで使用します。
XML解析の表定義にある式のデフォルト・ネームスペースを設定します。値はURIです。
この例ではデフォルトのネームスペースを定義します。
"oxh-default-namespace" = "http://example.com/foo"
XMLファイルの文字エンコードを指定します。サポートされているエンコードは、UTF-8 (デフォルト)、ISO-8859-1およびUS-ASCIIです。
表に対するXMLファイルはすべて、同じ文字エンコードを共有する必要があります。XMLファイルでのエンコード宣言は無視されます。
この例では、文字セットを定義します。
"oxh-charset" = "ISO-8859-1"
oxh-elements
プロパティで選択した要素を行の列にマップする方法を指定します。このプロパティ名では、nameを表の列の名前に置き換えます。値には任意のXQuery式を指定できます。式の初期コンテキスト項目("."変数)は、選択した要素にバインドされます。
問合せが正常に実行された場合でもログ・ファイルを確認してください。列式で値が返されない場合、または動的エラーが発生した場合、列値はNULL
です。エラーが初めて発生したときは、エラーがログに記録され、問合せ処理は続行します。同じ列式で発生した後続のエラーはログに記録されません。
対応するoxh-column
プロパティがない表の列は、次のプロパティが指定されている場合と同様に動作します。
"oxh-column.name" = "(./name | ./@name)[1]"
したがって、デフォルトの動作では、表の列名と一致する最初の子要素または属性が選択されます。「構文の例」を参照してください。
表の行にマップするXMLの要素の名前をカンマ区切りリストで示します。このプロパティは1回指定する必要があります。必須。
次の例では、XMLのfoo
という各要素をHive表の単一の行にマップします。
"oxh-elements" = "foo"
次の例では、XMLのfoo
またはbar
という各要素をHive表の行にマップします。
"oxh-elements" = "foo, bar"
エンティティ参照定義のセットを定義します。
次の例では、XMLのエンティティ参照が、&foo;
から"foo value"および&bar;
から"bar value"に拡張されます。
"oxh-entity.foo" = "foo value" "oxh-entity.bar" = "bar value"
ネームスペース・バインディングを定義します。
次の例では、接頭辞myns
をネームスペースhttp://example.org
にバインドします。
"oxh-namespace.myns" = "http://example.org"
このプロパティを複数回使用して、追加のネームスペースを定義できます。ネームスペース定義は、XMLの解析時に使用されます。oxh-element
およびoxh-column
プロパティの値でそれらを参照することもできます。
次の例では、http://example.org
ネームスペースのfoo
要素のみが表の行にマップされます。
"oxh-namespace.myns" = "http://example.org", "oxh-elements" = "myns:foo", "oxh-column.bar" = "./myns:bar"
この項で示す例は次のとおりです。
この例では、XML要素を列名にマップする方法を示します。
例7-1 基本的な列マッピング
次の表定義で、oxh-elements
プロパティは、XMLのfoo
という各要素が表の単一の行にマップされることを指定しています。oxh-column
プロパティは、BAR
というHive表の列では、STRING
に変換されたbar
という子要素の値を取得し、ZIP
という列では、INT
に変換されたzip
という子要素の値を取得することを指定しています。
CREATE TABLE example (bar STRING, zip INT) ROW FORMAT SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe' STORED AS INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat' OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat' TBLPROPERTIES( "oxh-elements" = "foo", "oxh-column.bar" = "./bar", "oxh-column.zip" = "./zip" )
例7-2 条件付き列マッピング
次のZIP
列の変更された定義で、列は、foo
要素に子のzip
要素がない場合、またはzip
要素に数値以外の値が含まれている場合は、-1の値を受け取ります。
"oxh-column.zip" = " if (./zip castable as xs:int) then xs:int(./zip) else -1 "
例7-3 デフォルトの列マッピング
次の2つの表定義は同等です。表定義2は、BAR
列とZIP
列のデフォルトのマッピングに基づいています。
表定義1
CREATE TABLE example (bar STRING, zip INT) ROW FORMAT SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe' STORED AS INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat' OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat' TBLPROPERTIES( "oxh-elements" = "foo", "oxh-column.bar" = "(./bar | ./@bar)[1]", "oxh-column.zip" = "(./zip | ./@zip)[1]" )
表定義2
CREATE TABLE example (bar STRING, zip INT) ROW FORMAT SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe' STORED AS INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat' OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat' TBLPROPERTIES( "oxh-elements" = "foo" )
これらの例は、架空のWebサイトのユーザーが送信したコメントを含む小規模なXMLドキュメントに関するHive表を作成する方法を示しています。ドキュメント(comments.xml
)の各comment
要素には、ユーザーがそのコメントを気に入ったことを示す1つ以上のlike
要素があります。
<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>
CREATE TABLE
の例では、comments.xml
入力ファイルは、ローカル・ファイル・システムの現在の作業ディレクトリにあります。
例7-4 表の作成
次のHiveのCREATE TABLE
コマンドでは、COMMENTS
というの表を作成します。ユーザー名、テキストおよびlikeの数が含まれる行が各コメントに対して1行あります。
hive> CREATE TABLE comments (usr STRING, content STRING, likeCt INT) ROW FORMAT SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe' STORED AS INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat' OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat' TBLPROPERTIES( "oxh-elements" = "comment", "oxh-column.usr" = "./@user", "oxh-column.content" = "./@text", "oxh-column.likeCt" = "fn:count(./like)" );
HiveのLOAD DATA
コマンドで、comments.xml
をCOMMENTS
表にロードします。
hive> LOAD DATA LOCAL INPATH 'comments.xml' OVERWRITE INTO TABLE comments; ]
次の問合せは、COMMENTS
表の内容を示します。
hive> SELECT usr, content, likeCt FROM comments;
.
.
.
john It is raining :( 0
kelly I won the lottery! 2
mike Happy New Year! 1
例7-5 XML列の問合せ
このCREATE TABLE
コマンドは前の例と似ていますが、like
要素がSTRING
列にXMLとして生成される点が異なります。
hive> CREATE TABLE comments2 (usr STRING, content STRING, likes STRING) ROW FORMAT SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe' STORED AS INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat' OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat' TBLPROPERTIES( "oxh-elements" = "comment", "oxh-column.usr" = "./@user", "oxh-column.content" = "./@text", "oxh-column.likes" = "fn:serialize(<likes>{./like}</likes>)" );
HiveのLOAD DATA
コマンドで、comments.xml
を表にロードします。ファイルの内容は、「簡単な例」を参照してください。
hive> LOAD DATA LOCAL INPATH 'comments.xml' OVERWRITE INTO TABLE comments2;
次の問合せは、COMMENTS2
表の内容を示します。
hive> SELECT usr, content, likes FROM comments2;
.
.
.
john It is raining :( <likes/>
kelly I won the lottery! <likes><like user="john"/><like user="mike"/></likes>
mike Happy New Year! <likes><like user="laura"/></likes>
次の問合せでは、like
要素からユーザー名を抽出します。
hive> SELECT usr, t.user FROM comments2 LATERAL VIEW > xml_table("likes/like", comments2.likes, struct("./@user")) t AS user; . . . kelly john kelly mike mike laura
例7-6 単一の文字列の列におけるXMLの生成
このコマンドでは、各コメントに対する行を含むCOMMENTS3
という表を作成し、単一のSTRING
列にXMLを生成します。
hive> CREATE TABLE comments3 (xml STRING) ROW FORMAT SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe' STORED AS INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat' OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat' TBLPROPERTIES( "oxh-elements" = "comment", "oxh-column.xml" = "fn:serialize(.)" );
HiveのLOAD DATA
コマンドで、comments.xml
を表にロードします。ファイルの内容は、「簡単な例」を参照してください。
hive> LOAD DATA LOCAL INPATH 'comments.xml' OVERWRITE INTO TABLE comments3;
次の問合せは、XML列の内容を示します。
hive> SELECT xml 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>
次の問合せでは、IDを抽出してそれらを整数に変換します。
hive> SELECT xml_query_as_int("comment/@id", xml) FROM comments3;
.
.
.
12345
56789
54321
次の各例では、全世界の無料の地図データを提供するOpenStreetMapからのデータを使用します。特定の地理的リージョンまたは地球全体のデータをXMLとしてエクスポートできます。OpenStreetMap XMLドキュメントには主に、一連のnode
、way
およびrelation
要素が含まれています。
次の各例では、OpenStreetMap XMLファイルが/user/name/osm
HDFSディレクトリに格納されます。
関連項目:
OpenStreetMapデータをダウンロードするには、次のサイトを参照してください。
OpenStreetMap XML形式については、次のサイトを参照してください。
例7-7 OpenStreetMap XMLに関する表の作成
この例では、次のように各node
要素に対する1行を含む、OpenStreetMap XMLに関する表を作成します。
node
要素のid
、lat
、lon
およびuser
属性は、表の列にマップされます。
年がtimestamp
属性から抽出され、YEAR
列にマップされます。ノードにtimestamp
属性がない場合、年には-1
が使用されます。
node
要素に子のtag
要素がある場合は、TAGS
列にXML文字列として格納されます。node
に子のtag
要素がない場合、列値はNULL
です。
hive> CREATE EXTERNAL TABLE nodes ( id BIGINT, latitude DOUBLE, longitude DOUBLE, year SMALLINT, tags STRING ) ROW FORMAT SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe' STORED AS INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat' OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat' LOCATION '/user/name/osm' TBLPROPERTIES ( "oxh-elements" = "node", "oxh-column.id" = "./@id", "oxh-column.latitude" = "./@lat", "oxh-column.longitude" = "./@lon", "oxh-column.year" = " if (fn:exists(./@timestamp)) then fn:year-from-dateTime(xs:dateTime(./@timestamp)) else -1 ", "oxh-column.tags" = " if (fn:exists(./tag)) then fn:serialize(<tags>{./tag}</tags>) else () " );
次の問合せは、年ごとのノード数を返します。
hive> SELECT year, count(*) FROM nodes GROUP BY year;
次の問合せは、ノード全体の合計タグ数を返します。
hive> SELECT sum(xml_query_as_int("count(tags/tag)", tags)) FROM nodes;
例7-8
OpenStreetMap XMLでは、node
、way
およびrelation
要素で、データに関与したユーザーなどの共通属性のセットが共有されます。次の表では、各node
、way
およびrelation
要素に対して1行生成します。
hive> CREATE EXTERNAL TABLE osm ( id BIGINT, uid BIGINT, type STRING ) ROW FORMAT SERDE 'oracle.hadoop.xquery.hive.OXMLSerDe' STORED AS INPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLInputFormat' OUTPUTFORMAT 'oracle.hadoop.xquery.hive.OXMLOutputFormat' LOCATION '/user/name/osm' TBLPROPERTIES ( "oxh-elements" = "node, way, relation", "oxh-column.id" = "./@id", "oxh-column.uid" = "./@uid", "oxh-column.type" = "./name()" );
次の問合せは、node
、way
およびrelation
要素の数を返します。TYPE
列は、選択した要素の名前であるnode
、way
またはrelation
のいずれかに設定されます。
hive> SELECT type, count(*) FROM osm GROUP BY type;
次の問合せは、個別のユーザーIDの数を返します。
hive> SELECT count(*) FROM (SELECT uid FROM osm GROUP BY uid) t;
この項では、Oracle XML Extensions for Hiveについて説明します。次のコマンドおよび関数について説明します。
この表に、Hiveプリミティブ・タイプおよびXMLスキーマ・タイプ間で自動的に行われる変換を示します。
表7-1 同等のデータ型
Hive | XMLスキーマ |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Hive関数は、次の外部ファイル・リソースにアクセスできます。
XMLスキーマ
XMLドキュメント
XQueryライブラリ・モジュール
これらのファイルは、HTTP (http://...
構文を使用)またはローカル・ファイル・システム(file://...
構文を使用)からそれらのURIによってアドレス指定できます。次の例では、タスクのローカル作業ディレクトリに対して相対的なファイルの場所が解決されるため、bar.xsdなどのURIを使用すると、分散キャッシュに追加されたファイルにアクセスできます。
xml_query(" import schema namespace tns='http://example.org' at 'bar.xsd'; validate { ... } ", . . .
ローカル・ファイルにアクセスするには、最初に、HiveのADD FILE
コマンドを使用してそのファイルをHadoop分散キャッシュに追加します。次に例を示します。
ADD FILE /local/mydir/thisfile.xsd;
それ以外の場合は、同じネットワーク・ドライブをマウントするか、ファイルをすべてのノードに単純にコピーするなど、クラスタのすべてのノードでファイルが使用できるようにする必要があります。デフォルトのベースURIは、ローカル作業ディレクトリに設定されます。
次のコマンドを使用して、Hive拡張関数のオンライン・ヘルプを取得できます。
DESCRIBE FUNCTION [EXTENDED] function_name;
次の例では、xml_query
関数の簡単な説明が示されます。
hive> describe function xml_query;
OK
xml_query(query, bindings) - Returns the result of the query as a STRING array
EXTENDED
オプションを使用すると、詳細な説明と例が示されます。
hive> describe function extended xml_query;
OK
xml_query(query, bindings) - Returns the result of the query as a STRING array
Evaluates an XQuery expression with the specified bindings. The query argument must be a STRING and the bindings argument must be a STRING or a STRUCT. If the bindings argument is a STRING, it is parsed as XML and bound to the initial context item of the query. For example:
> SELECT xml_query("x/y", "<x><y>hello</y><z/><y>world</y></x>") FROM src LIMIT 1;
["hello", "world"]
.
.
.
問合せの結果が空かどうかをテストします。
シグネチャ
xml_exists( STRING query, { STRING | STRUCT } bindings ) as BOOLEAN
説明
XQueryまたはXPath式。これは、関数が最初に評価されるときのみ読み込まれるため、定数値である必要があります。最初の問合せ文字列がコンパイルされ、後続のすべての呼出しで再使用されます。
Hadoop分散キャッシュおよびHTTPリソース(http://...
)に格納されているファイルにアクセスできます。XMLドキュメントの場合はXQueryのfn:doc
関数を使用し、プレーン・テキスト・ファイルにアクセスするにはfn:unparsed-text
およびfn:parsed-text-lines
関数を使用します。
問合せのコンパイル中にエラーが発生した場合は、関数でエラーが発生します。問合せの評価中にエラーが発生した場合、エラーは(生成されずに)ログに記録され、空の配列が返されます。
問合せで処理される入力。値は、XML STRING
または変数値のSTRUCT
です。
STRING
: 文字列は、問合せの初期コンテキスト項目にXMLとしてバインドされます。
STRUCT
: 偶数個のフィールドで構成されるSTRUCT
。フィールドの各ペアで、問合せの変数バインディング(名前, 値)が定義されます。名前フィールドのタイプはSTRING
である必要があり、値フィールドにはサポートされているプリミティブを指定できます。「データ型変換」を参照してください。
戻り値
問合せの結果が空でない場合はtrue
、結果が空または問合せで動的エラーが発生した場合はfalse
。
注意
問合せで発生した最初の動的エラーはログに記録されますが、後続のエラーは記録されません。
例
例7-9 STRINGバインディング
次の例では、入力XML文字列を解析し、問合せx/y
の初期コンテキスト項目にバインドします。
Hive> SELECT xml_exists("x/y", "<x><y>123</y></x>") FROM src LIMIT 1;
.
.
.
true
例7-10 STRUCTバインディング
次の例では、2つの問合せ変数$data
と$value
を定義します。
Hive> SELECT xml_exists( "parse-xml($data)/x/y[@id = $value]", struct( "data", "<x><y id='1'/><y id='2'/></x>", "value", 2 ) ) FROM src LIMIT 1; . . . true
例7-11 エラー・ロギング
次の例では、入力XMLが無効であるため、エラーがログに書き込まれます。
hive> SELECT xml_exists("x/y", "<x><y>123</invalid></x>") FROM src LIMIT 1;
.
.
.
false
問合せの結果をSTRING
値の配列として返します。
シグネチャ
xml_query( STRING query, { STRING | STRUCT } bindings ) as ARRAY<STRING>
説明
XQueryまたはXPath式。これは、関数が最初に評価されるときのみ読み込まれるため、定数値である必要があります。最初の問合せ文字列がコンパイルされ、後続のすべての呼出しで再使用されます。
Hadoop分散キャッシュおよびHTTPリソース(http://...
)に格納されているファイルにアクセスできます。XMLドキュメントの場合はXQueryのfn:doc
関数を使用し、プレーン・テキスト・ファイルにアクセスするにはfn:unparsed-text
およびfn:parsed-text-lines
関数を使用します。例7-15を参照してください。
問合せのコンパイル中にエラーが発生した場合は、関数でエラーが発生します。問合せの評価中にエラーが発生した場合、エラーは(生成されずに)ログに記録され、空の配列が返されます。
問合せで処理される入力。値は、XML STRING
または変数値のSTRUCT
です。
戻り値
STRING
値のHive配列であり、一連のアトミック値に変換される問合せの結果です。問合せの結果が空の場合、戻り値は空の配列です。
例
例7-12 STRINGバインディングの使用
次の例では、入力XML文字列を解析し、問合せx/y
の初期コンテキスト項目にバインドします。
hive> SELECT xml_query("x/y", "<x><y>hello</y><z/><y>world</y></x>") FROM src LIMIT 1; . . . ["hello","world"]
例7-13 STRUCTバインディングの使用
次の例では、2番目の引数は、2つの問合せ変数$data
と$value
を定義するSTRUCT
です。STRUCT
の変数の値は、「データ型変換」で説明されているように、XMLスキーマ・タイプに変換されます。
hive> SELECT xml_query( "fn:parse-xml($data)/x/y[@id = $value]", struct( "data", "<x><y id='1'>hello</y><z/><y id='2'>world</y></x>", "value", 1 ) ) FROM src LIMIT 1; . . . ["hello"]
例7-14 シリアライズされたXMLの取得
次の例では、fn:serialize
関数を使用して、シリアライズされたXMLを返します。
hive> SELECT xml_query( "for $y in x/y return fn:serialize($y) ", "<x><y>hello</y><z/><y>world</y></x>" ) FROM src LIMIT 1; . . . ["<y>hello</y>","<y>world</y>"]
例7-15 Hadoop分散キャッシュへのアクセス
次の例では、test.xmlという名前のファイルを分散キャッシュに追加し、fn:doc
関数を使用してそれを問い合せます。ファイルには、次の値が格納されます。
<x><y>hello</y><z/><y>world</y></x>
hive> ADD FILE test.xml; Added resource: test.xml hive> SELECT xml_query("fn:doc('test.xml')/x/y", NULL) FROM src LIMIT 1; . . . ["hello","world"]
例7-16 失敗した問合せの結果
次の例は、入力XMLが無効であるため、空の配列を返します。XML解析エラーがログに書き込まれます。
hive> SELECT xml_query("x/y", "<x><y>hello</y></invalid") FROM src LIMIT 1;
.
.
.
[]
Hiveプリミティブ値として問合せの結果を返します。各Hiveプリミティブ・データ・タイプには、そのタイプに対応する名前の個別の関数があります。
xml_query_as_string
xml_query_as_boolean
xml_query_as_tinyint
xml_query_as_smallint
xml_query_as_int
xml_query_as_bigint
xml_query_as_double
xml_query_as_float
シグネチャ
xml_query_as_primitive ( STRING query, {STRUCT | STRING} bindings, } as primitive
説明
XQueryまたはXPath式。これは、関数が最初に評価されるときのみ読み込まれるため、定数値である必要があります。最初の問合せ文字列がコンパイルされ、後続のすべての呼出しで再使用されます。
Hadoop分散キャッシュおよびHTTPリソース(http://...
)に格納されているファイルにアクセスできます。XMLドキュメントの場合はXQueryのfn:doc
関数を使用し、プレーン・テキスト・ファイルにアクセスするにはfn:unparsed-text
およびfn:parsed-text-lines
関数を使用します。例7-15を参照してください。
問合せのコンパイル中にエラーが発生した場合は、関数でエラーが発生します。問合せの評価中にエラーが発生した場合、エラーは(生成されずに)ログに記録され、空の配列が返されます。
問合せで処理される入力。値は、XML STRING
または変数値のSTRUCT
です。
STRING
: 文字列は、問合せの初期コンテキスト項目にXMLとしてバインドされます。例7-17を参照してください。
STRUCT
: 偶数個のフィールドで構成されるSTRUCT
。フィールドの各ペアで、問合せの変数バインディング(名前, 値)が定義されます。名前フィールドのタイプはSTRING
である必要があり、値フィールドにはサポートされているプリミティブを指定できます。「データ型変換」および例7-18を参照してください。
問合せの結果の最初の項目が、プリミティブ・タイプの関数にマップされるXMLスキーマ・タイプにキャストされます。問合せで複数の項目が返される場合、最初の項目以外はすべて無視されます。
戻り値
アトミック値に変換されたHiveプリミティブ値(問合せによって返される最初の項目)。問合せの結果が空の場合、戻り値はNULL
です。
例
例7-17 STRINGバインディングの使用
次の例では、入力XML文字列を解析し、問合せx/y
の初期コンテキスト項目にバインドします。
hive> SELECT xml_query_as_string("x/y", "<x><y>hello</y></x>") FROM src LIMIT 1;
.
.
.
"hello"
次は、他のプリミティブ関数を使用する文字列バインディングの例です。
hive> SELECT xml_query_as_int("x/y", "<x><y>123</y></x>") FROM src LIMIT 1; . . . 123 hive> SELECT xml_query_as_double("x/y", "<x><y>12.3</y></x>") FROM src LIMIT 1; . . . 12.3 hive> SELECT xml_query_as_boolean("x/y", "<x><y>true</y></x>") FROM src LIMIT 1; . . . true
例7-18 STRUCTバインディングの使用
次の例では、2番目の引数は、2つの問合せ変数$data
と$value
を定義するSTRUCT
です。STRUCT
の変数の値は、「データ型変換」で説明されているように、XMLスキーマ・タイプに変換されます。
hive> SELECT xml_query_as_string( "fn:parse-xml($data)/x/y[@id = $value]", struct( "data", "<x><y id='1'>hello</y><z/><y id='2'>world</y></x>", "value", 2 ) ) FROM src LIMIT 1; . . . world
例7-19 複数の問合せ結果を返す例
次の例は、問合せから最初の項目(hello)のみを返します。2番目の項目(world)は破棄されます。
hive> SELECT xml_query_as_string("x/y", "<x><y>hello</y><z/><y>world</y></x>") FROM src LIMIT 1;
.
.
.
hello
例7-20 空の問合せ結果を返す例
次の例は、問合せの結果が空であるためNULL
を返します。
hive> SELECT xml_query_as_string("x/foo", "<x><y>hello</y><z/><y>world</y></x>") FROM src LIMIT 1;
.
.
.
NULL
例7-21 シリアライズされたXMLの取得
次の各例は、fn:serialize
関数を使用して複雑なXML要素をSTRING
値として返します。
hive> SELECT xml_query_as_string("fn:serialize(x/y[1])", "<x><y>hello</y><z/><y>world</y></x>") FROM src LIMIT 1; . . . "<y>hello</y>" hive> SELECT xml_query_as_string( "fn:serialize(<html><head><title>{$desc}</title></head><body>Name: {$name}</body></html>)", struct( "desc", "Employee Details", "name", "John Doe" ) ) FROM src LIMIT 1; ... <html><head><title>Employee Details</title></head><body>Name: John Doe</body></html>
例7-22 Hadoop分散キャッシュへのアクセス
次の例では、test.xml
という名前のファイルを分散キャッシュに追加し、fn:doc
関数を使用してそれを問い合せます。ファイルには、次の値が格納されます。
<x><y>hello</y><z/><y>world</y></x>
Hive> ADD FILE test.xml; Added resource: test.xml Hive> SELECT xml_query_as_string("fn:doc('test.xml')/x/y[1]", NULL) FROM src LIMIT 1; . . . hello
例7-23 失敗した問合せの結果
次の例は、</invalid
の山カッコがないためNULL
を返します。XML解析エラーがログに書き込まれます。
Hive> SELECT xml_query_as_string("x/y", "<x><y>hello</invalid") FROM src LIMIT 1;
.
.
.
NULL
次の例は、foo
をxs:float
としてキャストできないためNULL
を返します。キャスト・エラーがログに書き込まれます。
Hive> SELECT xml_query_as_float("x/y", "<x><y>foo</y></x>") FROM src LIMIT 1;
.
.
.
NULL
XML値を表の1行以上の行にマップするか、または表の行にマップしないユーザー定義の表生成関数(UDTF)。この関数を使用すると、XMLのネストされた繰返し要素をHive表の行にマップできます。
シグネチャ
xml_table( STRUCT? namespaces, STRING query, {STRUCT | STRING} bindings, STRUCT? columns )
説明
問合せおよび列の式で使用できるネームスペースを指定します。オプション。
値は、偶数個のSTRING
フィールドで構成されるSTRUCT
です。フィールドの各ペアで、問合せまたは列の式で使用されるネームスペース・バインディング(接頭辞, URI)が定義されます。例7-26を参照してください。
返される各値に対する表の行を生成するXQueryまたはXPath式。これは、関数が最初に評価されるときのみ読み込まれるため、定数値である必要があります。最初の問合せ文字列がコンパイルされ、後続のすべての呼出しで再使用されます。
問合せ処理時に動的エラーが発生した場合、関数でエラーは発生しませんが、最初はエラーがログに記録されます。後続の動的エラーはログに記録されません。
問合せで処理される入力。値は、XML STRING
または変数値のSTRUCT
です。
生成される行の列を定義するXQueryまたはXPath式。オプション。
値は、追加のXQuery式を含むSTRUCT
です。XQuery式は、関数が最初に評価されるときのみ読み込まれるため、定数のSTRING
値である必要があります。STRUCT
の各列式に対して、表に1つの列があります。
問合せで返される各項目に対して、式の初期コンテキスト項目として現在の項目で列式が評価されます。列式の結果はSTRING
値に変換され、行の値になります。
列式の結果が空の場合、または列式の評価時に動的エラーが発生した場合、対応する列値はNULL
です。列式で複数の項目が返される場合、最初の項目以外はすべて無視されます。
columns引数の省略は、'struct(".")'
と指定することと同じです。例7-25を参照してください。
戻り値
query引数で返される各項目に対する1行の表の行。
注意
XML表アダプタを使用すると、HDFSの大規模なXMLファイルに関するHive表を作成できます。「XML表に対するHiveのCREATE TABLE構文」を参照してください。
例
注意:
xml_query_as_string
関数を使用すると、この例で同じ結果を得ることができます。ただし、xml_table
は、単一の関数呼出しで3つの列値すべてを設定し、各行に対する入力XMLの解析が1回のみであるため、より効率的です。xml_query_as_string
関数では、3つの列それぞれに対して別々の関数呼出しが必要であり、同じ入力XML値が毎回再解析されます。
例7-24 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
例7-25 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
例7-26 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
例7-27 XMLドキュメントのHive表の問合せ
次の例では、タイプがSTRING
のXML_STR
という単一の列がある、COMMENTS3
表を問い合せます。次の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>
次の問合せは、COMMENTS3
表からユーザー、テキストおよび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
例7-28 ネストされたXML要素の表の行へのマッピング
次の例は、xml_table
を使用して、ネストされた繰返しXML要素を表の行にフラット化する方法を示しています。COMMENTS
表は、前の例を参照してください。
> 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
例7-29 オプションのネストされたXML要素の表の行へのマッピング
次の例は、前の例を少し変更したもので、コメントにlikeがない場合でも行を生成します。COMMENTS
表は、例7-27 を参照してください。
> 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-30 新規ビューの作成
表生成関数と同じ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
例7-31 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