2017-09-08 11 views
0
<Search> 

<Country>USA</Country> 
<Region>West</Region> 
<Address> 
    <Home> 
     <Item> 
       <id>Number</id> 
       <value>135</value> 
      </Item> 
     <Item> 
       <id>Street</id> 
       <value>Pacific</value> 
      </Item> 
     <Item> 
       <id>City</id> 
       <value>Irvine</value> 
      </Item> 
     </Home> 
    <Home> 
     <Item> 
       <id>Number</id> 
       <value>1672</value> 
      </Item> 
     <Item> 
       <id>Street</id> 
       <value>Madison</value> 
      </Item> 
     <Item> 
       <id>City</id> 
       <value>Denver</value> 
      </Item> 
     </Home> 
    </Address> 

私は下のテーブル構造を作成しようとしていますが、私は、私は以下のテーブル構造を作成しようとしているが、私午前望ましい結果ハイブ-XML-SerDe - キー/値ペア - 地図

を取得しておりません私は下のテーブル構造を作成しようとしていますが、私は、私は以下のテーブル構造を作成しようとしています 望ましい結果を得ていないのですが、私は

Country Region      Map 
USA  West    {Number:135,Street:Pacific,City:Irvine} 
USA  West    {Number:1672,Street:Madison,City:Denver} 

`CREATE EXTERNAL TABLE search(
country string, 
region string, 
search array<struct<item:map<string,string>>> 
) 
PARTITIONED BY(date STRING) 
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe' 
WITH SERDEPROPERTIES(
"column.xpath.country" = "/Search/country/text()", 
"column.xpath.region" = "/Search/region/text()", 
"column.xpath.item"="/Search/Address/Home/Item" 
) 
STORED AS 
INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' 
LOCATION '/search' 
TBLPROPERTIES (
"xmlinput.start"="", 
"xmlinput.end"="" 
); 

は、所望の結果を得ていないのです 望ましい結果を得ていないのですこの可能性または他の提案このデータを上記の形式で取得する方法については、どんな助けも素晴らしいだろう。ありがとうございました。 `

答えて

0

はXMLを考えると、あなたができる最善のは、おそらくこのようなものである:ここでは

DROP TABLE IF EXISTS xml_47; 

CREATE TABLE xml_47(
    country string, 
    region string, 
    address array<struct<Home:array<struct<Item:struct<id:string,value:string>>>>> 
) 
ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe' 
WITH SERDEPROPERTIES(
"column.xpath.country" = "/Search/Country/text()", 
"column.xpath.region" = "/Search/Region/text()", 
"column.xpath.address"="/Search/Address/Home" 
) 
STORED AS 
INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' 
TBLPROPERTIES (
"xmlinput.start"="<Search>", 
"xmlinput.end"="</Search>" 
); 

load data local inpath '/Users/dvasilen/Misc/XML/47.xml' OVERWRITE into table xml_47; 

select * from xml_47; 

が出力されます。

USA West [{"home":[{"item":{"id":"Number","value":"135"}},{"item":{"id":"Street","value":"Pacific"}},{"item":{"id":"City","value":"Irvine"}}]},{"home":[{"item":{"id":"Number","value":"1672"}},{"item":{"id":"Street","value":"Madison"}},{"item":{"id":"City","value":"Denver"}}]}] 
Time taken: 0.067 seconds, Fetched: 1 row(s) 

要素を取得するには:

select address[0].home[0] from xml_47; 
OK 
{"item":{"id":"Number","value":"135"}} 
Time taken: 0.076 seconds, Fetched: 1 row(s) 

希望の出力を得るには:

USA West {Number:135,Street:Pacific,City:Irvine} 
USA West {Number:1672,Street:Madison,City:Denver} 

あなたは側面図を使用してaddress配列をフラット化する必要があります、私はこのフォーマット USA WEST [NUMBER、ストリート、市] [135、太平洋、アーバイン] USA WESTのデータを取得することができていますhttps://cwiki.apache.org/confluence/display/Hive/LanguageManual+LateralView

+0

[NUMBER、ストリート、市] [1672年、マディソン、デンバー] 私は USA WEST [NUMBER:135、ストリート:太平洋、市:アーバイン]そこから以下のフォーマットを取得するにはどうすればよい USA WEST [NUMBER:1672 、ストリート:Madison、City:Denver] – Paciferous