蜂巢 - LATERAL VIEW爆炸xpath

时间:2013-12-10 00:17:25

标签: xpath view hive explode lateral

我有以下输入XML:

 <?xml version="1.0"?>
<Employees>
    <Employee emplid="1111">
        <lastname>Watson</lastname>
        <age>30</age>
        <email>johnwatson@sh.com</email>
    </Employee>
    <Employee emplid="2222">
        <firstname>Sherlock</firstname>
        <lastname>Holmes</lastname>
        <age>32</age>
        <email>sherlock@sh.com</email>
    </Employee>
</Employees>

请注意员工1111缺少的姓名

我正在执行以下选择:

 select 
     c1.emplid,
     fname,
     lname
     from(
     select emplid, xmldata from employeeXML 
     LATERAL VIEW explode (xpath(xmldata,'/Employees/Employee/@emplid')) dummyTable as emplid )c1

     LATERAL VIEW explode (xpath(xmldata,concat('/Employees/Employee[@id="',c1.emplid,'"',']/firstname/text()')))dummyTable2 as fname
     LATERAL VIEW explode (xpath(xmldata,concat('/Employees/Employee[@id="',c1.emplid,'"',']/lastname/text()'))) dummyTable3 
     as lname;

预期结果:

 1111 NULL     Watson
 2222 Sherlock Holmes

请注意缺少名字的NULL值)

然而我得到以下结果:

2222夏洛克·福尔摩斯

因为员工1111缺少名字,我没有让第一名员工回到我的查询中。 有没有办法让第一个名称设置为NULL的预期结果中指示的员工数据和/或缺少时的空间? 请帮忙。 感谢,

1 个答案:

答案 0 :(得分:0)

你总是可以用空字符串连接结果,这应该没问题:

concat(/Employees/Employee[@id="..."]/firstname/text(), '')

这不是您在配置单元中使用的连接,而是内部XPath函数,因此您可能会在一行中同时应用XPath和Hive concat。

顺便说一下,我想您想使用@emplid代替@id来匹配您的数据?