2016-11-09 16 views
2

でXPATHを使用してXMLノードの名前を取得します:ハイブに次のように私は、XML文書を持っているハイブ

<note> 
    <to>Tove</to> 
    <from>Jani</from> 
    <heading>Reminder</heading> 
    <body>Don't forget me this weekend!</body> 
</note> 

を、私が使用してXML文書内の各ノードのテキストを取得するためにxpathを使用することができています次のコマンドを実行します。ただし

select xpath(xml_text,'//*[name()='note']//text()') from table_test;

、私は上記の例では、テキスト のXMLノード名を取得するために、ハイブに使用するXPATHコマンド把握することはできません、私はを返すことができるようにしたいです["to","from","heading","body"]は、XMLファイル内のトークンのXMLノードを表します。 何か助けていただければ幸いです。

答えて

2

一般に、xpathは、ノードの名前ではなく、テキスト属性または要素属性を取得するためにのみ使用できます。

したがって、次の2つのオプションがあります。与えられたxpathのノード名を返すカスタムUDFを書く(またはオンラインで見つける)ことができます。

それとも、あなたはこのハックを使用することができます。

select xpath(regexp_replace(xml_text,'<([\\w]+),'<$1 nodename=\'$1\' '),note/*/@nodename) 

説明:それは、任意のXML要素にnodeName属性を追加します。 (<to> -> <to nodename='to'>)これは一部のテキストにも追加されますが、nodename属性のみを抽出するため、重要ではありません。

select xpath(xml_text,'note/*/text()') from table_test;

+0

おかげでアレックス、カスタムUDFための任意の勧告を:ところで

、あなたはあなたにテキストクエリを書き換えることができますか? –

+1

@DonGorgon [オリジナルのハイブxpath UDF](https://github.com/apache/hive/blob/master/ql/src/java/org/apache/hadoop/hive/ql/udf/xml/)を利用することができます。 GenericUDFXPath.java)、 'getNodeValue()'から 'getNodeName()'に83行目を変更します。おそらくノードが要素であることを確認するためにいくつかのテストを追加してください –

+0

提案をありがとう。それは間違いなく機能します。 –

関連する問題