2017-03-01 24 views
2

XMLファイルをハイブテーブルにロードしようとしています。以下は私のハイブテーブルのクエリです。XMLデータをハイブテーブルにロード中にエラーが発生しました

CREATE TABLE MYDATA(NAME STRING, AGE INT, SEX STRING) 
    ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe' 
    WITH SERDEPROPERTIES(
    "column.xpath.NAME"="/TAG/NAME/text()", 
    "column.xpath.AGE"="/TAG/AGE/int()", 
    "column.xpath.SEX"="/TAG/SEX/text()") 
    STORED AS INPUTFORMAT 'com.ibm.spss.hive.serde2.xml.XmlInputFormat' 
    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' 
    LOCATION '/home/sid/hivexmltab' 
    TBLPROPERTIES("xmlinput.start"="<TAG","xmlinput.end"="</TAG>"); 

私の入力ファイルは、以下の形式である:

<TAG> 
<NAME>ABCD</NAME><AGE>25</AGE><SEX>male</SEX> 
<NAME>EFGH</NAME><AGE>23</AGE><SEX>female</SEX> 
</TAG> 

私は以下のような出力を見てみたい:

ABCD,25,male 
EFGH,23,female 

しかし、イムは、以下のような出力を得る:

<string>ABCDEFGH</string> NULL <string>malefemale</string> 

jaファイルを使用しています:hivex mlserde-1.0.5.3.jar for Xml SerDe

ここでエラーが発生しているのは誰ですか? 何か助けていただければ幸いです。

答えて

1

これは1つの悪いXML構造です...
<NAME>...</NAME><AGE>...</AGE><SEX>...</SEX>の任意の組み合わせは、追加タグで囲まれていなければなりません。


CREATE EXTERNAL TABLE MYDATA 
(
    NAME array<string> 
    ,AGE  array<int> 
    ,SEX  array<string>  
) 
    ROW FORMAT SERDE 'com.ibm.spss.hive.serde2.xml.XmlSerDe' 
    WITH SERDEPROPERTIES 
    (
     "column.xpath.NAME" = "TAG/NAME/text()" 
     ,"column.xpath.AGE" = "TAG/AGE/text()" 
     ,"column.xpath.SEX" = "TAG/SEX/text()" 
    ) 
    STORED AS 
    INPUTFORMAT  'com.ibm.spss.hive.serde2.xml.XmlInputFormat' 
    OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' 
    LOCATION  '/home/sid/hivexmltab' 
    TBLPROPERTIES 
    (
     "xmlinput.start" = "<TAG" 
     ,"xmlinput.end" = "</TAG>" 
    ) 
; 

select * from MYDATA 
; 

+-----------------+------------+-------------------+ 
|  a.name  | mydata.age | mydata.sex  | 
+-----------------+------------+-------------------+ 
| ["ABCD","EFGH"] | [25,23] | ["male","female"] | 
+-----------------+------------+-------------------+ 

select NAME[pe.n] as name 
     ,AGE [pe.n] as age 
     ,SEX [pe.n] as sex 

from MYDATA m 
     lateral view posexplode (m.NAME) pe as n,x 
; 

+------+-----+--------+ 
| name | age | sex | 
+------+-----+--------+ 
| ABCD | 25 | male | 
| EFGH | 23 | female | 
+------+-----+--------+ 
+0

その働き。 xmlファイルを読み込むための適切なテーブル構造の構築に本当に助けになりました。 – Sidhartha

1

使用テキスト()どこにでも、と年齢の一部を変更します。

"column.xpath.AGE"="/TAG/AGE/text()" 

あなたはハイブ表の後半で

をデータ型を変更することができCREATE TABLEから位置部分を削除します。

LOCATION '/home/sid/hivexmltab' 

をし、 LOADコマンドを使用して表を作成した後にすべてのデータをロードする

load data local inpath '/home/sid/hivexmltab/XMLfile.xml' overwrite into table MYDATA; 
関連する問題