文字列の1つにXMLが含まれているHiveテーブルがあります。Xpathを使用してXMLノードをHiveテーブルに抽出する
DataTable
key: string
xml: string
およびXML形式であること:0..Nエンティティノードと
<xml>
<entity>
<property type="alpha">123</property>
<property type="beta">abc</property>
<property type="delta">...</property>
</entity>
<entity>
<property type="alpha">321</property>
<property type="beta">cba</property>
<property type="delta">---</property>
</entity>
</xml>
簡略化するために、テーブルがあると仮定する。
私は、次の形式で新しいハイブのテーブルにこのデータを変換したい:
TransformedTable
key: string
alpha: string
beta: string
delta: string
が、私は難しいそれを見つけることです。私はハイヴェにはかなり新しいですが、このような何かを考えていれば、それは道のりです。
次の質問は関連しています
が、答えを持っていません。そして、この質問は、関連する答えがあります。
を私は、私はこのケースでのxml SerDeを使用することができるとは思いません。その研究を通して、私はこのようなものを試してみた:
select key,
xpath(xml, 'xml/entity/property[@type="alpha"]/text()')) as alpha,
xpath(xml, 'xml/entity/property[@type="beta"]/text()')) as beta,
xpath(xml, 'xml/entity/property[@type="delta"]/text()')) as delta
from DataTable
それは、この中で結果:
代わりに私が本当に欲しいもののkey1 ["123", "321"] ["abc", "cba"] ["...", "---"]
key2 ["123", "321"] ["abc", "cba"] ["...", "---"]
:
key1 123 abc ...
key1 321 cba ---
key2 123 abc ...
key2 321 cba ---
ありがとうこれを読む時間を割いて、あなたが私に与えることができるアイデアを感謝します!
Chrisに感謝します。あなたの答えは正しいものであり、教育的です。非常に役に立ちました!今私はすべてのエンティティが "ベータ"のプロパティを持っているわけではないので、何とかこのようにOUTERのビューをまとめようとすると苦労しています。その場合、ベータのカラムにNULLが必要です。私はそれをもう少し試してみて、それを理解できなければ別の質問を投稿します。再度、感謝します。 – Ckratide
@Ckratide、これを聞いてうれしい!あなたがより多くのカスタムロジックが必要な道にいるように思えます。私は自分のカスタムUDTFを書くことを検討したいという答えを編集しました。 https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide+UDTF –