2

我有以下输入 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 和/或缺少空格时?请帮忙。谢谢,

4

1 回答 1

0

您始终可以将结果与空字符串连接起来,这应该没问题:

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

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

顺便说一句,我猜你想使用@emplid而不是@id匹配你的数据?

于 2013-12-11T22:07:34.470 回答