2017-07-07 8 views
0

キー値のペアの組み合わせ。 IDを列名として、そして各列の対応するデータとしてVALUEを分解しようとしています。ハイブ - XML- Serde - キー値ペア - テーブルの作成

`<CT> <items> <item> <field> <id>Column1</id> <value>25672</value> </field> 
<field> <id>Column2</id> <value>FGE</value> </field> <field> 
<id>Column3</id> <value>Florence to Venice</value> </field> </item> 
</items> 
</CT>` 

私たちは以下のようにテーブルを作成するために期待している、 予想される出力:

Column1 Column2 Column3 
25672 FGE  Florence to Venice 

は、我々は、キーと値のペアを抽出するために地図を使用してみましたが、我々は、所望の結果を取得されていません。あなたは

<?xml version="1.0" encoding="UTF-8"?> 
<CT> 
    <messageID>11736</messageID> 
    <items> 
     <item> 
     <field> 
      <id>Column1</id> 
      <value>25672</value> 
     </field> 
     <field> 
      <id>Column2</id> 
      <value>FGE</value> 
     </field> 
     <field> 
      <id>Column3</id> 
      <value>Florence to Venice</value> 
     </field> 
     </item> 
    </items> 
</CT> 

その後、次のXMLからのメッセージIDなどのIDと値を、私は考えキャプチャする必要がある場合は

+0

が起こることはないだろう。列は事前に知っておく必要があります。 –

+0

ありがとうございます。列を知り、期待される列を持つ表を作成した場合、その列の値の部分をそれぞれの列にマップできますか? – Paciferous

答えて

1

https://github.com/dvasilen/Hive-XML-SerDe/issues/42

を参照してください

'CREATE EXTERNAL TABLE dev.reference_test(
PM_SubCollection array<map<string,string>> 
) 
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe' 
WITH SERDEPROPERTIES(
"column.xpath.PM_SubCollection"="/CT/items/item/field", 
"xml.map.specification.id"="#id->#value" 
) 
STORED AS 
INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' 
LOCATION '/dev/reference_test' 
TBLPROPERTIES (
"xmlinput.start"="", 
"xmlinput.end"="" 
);' 


Output: 
'[{"field":"Column125672"},{"field":"Column2FGE"},{"field":"Column3Florence to Venice"}]' 

任意の提案を参考になりますDDLは次のようになります。

DROP TABLE IF EXISTS xml_42a; 

CREATE TABLE xml_42a(
message_id string, 
fields array<struct<field:struct<id:string,value:string>>> 
) 
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe' 
WITH SERDEPROPERTIES(
    "column.xpath.message_id"="/CT/messageID/text()", 
    "column.xpath.fields"="/CT/items/item/field" 
) 
STORED AS 
INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' 
TBLPROPERTIES (
"xmlinput.start"="<CT>", 
"xmlinput.end"="</CT>" 
); 

load data local inpath '/Users/dvasilen/Misc/XML/42a.xml' OVERWRITE into table xml_42a; 

select * from xml_42a; 

、ここでは出力されます:

hive> 
    > select * from xml_42a; 
OK 
11736 [{"field":{"id":"Column1","value":"25672"}},{"field":{"id":"Column2","value":"FGE"}},{"field":{"id":"Column3","value":"Florence to Venice"}}] 
Time taken: 0.08 seconds, Fetched: 1 row(s) 
関連する問題