我目前正在尝试在PIG脚本中使用XPath循环嵌套的XML元素,并且我面临一些限制。以下是我尝试做的一个虚拟示例:
我有一个类似于以下内容的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<Log CPEID="1847671824" CUID="0" >
<Event EventTime="2015-10-14T21:50:00">
<Action>A</Action>
</Event>
<Event EventTime="2015-10-14T22:55:12">
<Action>B</Action>
</Event>
<Event EventTime="2015-10-14T23:54:51">
<Action>C</Action>
</Event>
</Log>
我想输出以下结果:
CUID | CPEID | EventTime | Action
---------------------------------------------------------------
123456789 | 56431284132 | 2015-10-14T21:50:00 | A
123456789 | 56431284132 | 2015-10-14T22:55:12 | B
123456789 | 56431284132 | 2015-10-14T23:54:51 | C
如果我使用&#34; Log&#34;加载XML文件。加载器中的元素(见下),我无法循环播放&#34;事件&#34;元件。
REGISTER 'piggybank.jar';
DEFINE XPath org.apache.pig.piggybank.evaluation.xml.XPath();
ALL_XMLs = LOAD 'test.xml' using org.apache.pig.piggybank.storage.XMLLoader('Log') as (x:chararray);
如果我使用&#34;事件&#34;加载XML文件element,我无法访问父元素。 (XMLLoader输出后的正常情况)
ALL_XMLs = LOAD 'test.xml' using org.apache.pig.piggybank.storage.XMLLoader('Element') as (x:chararray);
有没有人遇到过同样的问题,并且有想法正确处理这个例子?我知道UDF可以帮助我,但考虑到这一点必须易于维护,我当然希望只使用Pig / Hive,如果可能的话。
我的猪脚本,仅访问第一个&#34;事件&#34; element(循环打开&#34; Log&#34;元素):
REGISTER 'piggybank.jar';
DEFINE XPath org.apache.pig.piggybank.evaluation.xml.XPath();
ALL_XMLs = LOAD 'test.xml'
using org.apache.pig.piggybank.storage.XMLLoader('Log') as (x:chararray);
Logs = FOREACH ALL_XMLs GENERATE
XPath(x, 'Log/@CUID'),
XPath(x, 'Log/@CPEID'),
XPath(x, 'Log/Event/@EventTime'),
XPath(x, 'Log/Event/Action');
DUMP Logs;
结果(不是我想要的......见上文):
0;1847671824;2015-10-14T21:50:00;A