使用PIG进行XML展平:嵌套循环和父节点访问

时间:2015-12-14 15:35:57

标签: xml hadoop hive apache-pig bigdata

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

0 个答案:

没有答案