2017-09-08 5 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> 

Je suis en train de créer la structure de tableau ci-dessous, mais je ne reçois pas le résultat souhaitéHive-XML-SerDe - Key/NVP - Carte

Je suis en train de créer la structure de tableau ci-dessous, mais je Je ne suis pas d'obtenir le résultat désiré Je suis en train de créer la structure de tableau ci-dessous, mais je ne reçois pas le résultat souhaité Je suis en train de créer la structure de tableau ci-dessous, mais je ne reçois pas le résultat souhaité

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"="" 
); 

Est ce possible ou tout autre suggère ions sur la façon d'obtenir ces données dans le format ci-dessus. Toute aide est la bienvenue. Je vous remercie. `

Répondre

0

Compte tenu du XML, le meilleur que vous pouvez faire est probablement quelque chose comme ceci:

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; 

Voici la sortie:

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) 

Pour accéder aux éléments:

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

Pour obtenir la sortie désirée:

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

vous devrez aplatir le tableau address utilisant VIEW LATERAL https://cwiki.apache.org/confluence/display/Hive/LanguageManual+LateralView

+0

Je suis en mesure d'obtenir les données dans ce format USA WEST [NUMÉRO, Rue, Ville] [135, Pacifique, Irvine] USA WEST [numéro, rue, ville] [1672, Madison, Denver] Comment puis-je obtenir le format ci-dessous à partir de là USA WEST [NUMÉRO: 135, rue: Pacific, Ville: Irvine] USA WEST [NUMÉRO: 1672 , Rue: Madison, Ville: Denver] – Paciferous