我有以下输入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的预期结果中指示的员工数据和/或缺少时的空间? 请帮忙。 感谢,
答案 0 :(得分:0)
你总是可以用空字符串连接结果,这应该没问题:
concat(/Employees/Employee[@id="..."]/firstname/text(), '')
这不是您在配置单元中使用的连接,而是内部XPath函数,因此您可能会在一行中同时应用XPath和Hive concat。
顺便说一下,我想您想使用@emplid
代替@id
来匹配您的数据?