【问题标题】:Error while loading XML data into hive table将 XML 数据加载到配置单元表时出错
【发布时间】:2017-03-02 01:02:01
【问题描述】:

我正在尝试将 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>

我正在使用 jar 文件:用于 Xml SerDe 的 hivexmlserde-1.0.5.3.jar

谁能告诉我我在这里犯了什么错误? 任何帮助表示赞赏。

【问题讨论】:

    标签: hadoop hive


    【解决方案1】:

    这是一种糟糕的 XML 结构...
    &lt;NAME&gt;...&lt;/NAME&gt;&lt;AGE&gt;...&lt;/AGE&gt;&lt;SEX&gt;...&lt;/SEX&gt; 的任何组合都应该被附加标签包裹。


    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 |
    +------+-----+--------+
    

    【讨论】:

    • 它的工作。在构建加载 xml 文件的适当表结构方面确实有很大帮助。
    【解决方案2】:

    在任何地方使用 text() ,将年龄部分修改为:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 2018-07-27
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      相关资源
      最近更新 更多