我正在尝试使用pig解析带有嵌套标签的xml文件。我有以下xml样本。
<Document>
<medicationsInfo>
<code>10160-0</code>
<entryInfo>
<statusCode>completed</statusCode>
<startTime>20110729</startTime>
<endTime>20110822</endTime>
<strengthValue>24</strengthValue>
<strengthUnits>h</strengthUnits>
</entryInfo>
<entryInfo>
<statusCode>completed</statusCode>
<startTime>20120130</startTime>
<endTime>20120326</endTime>
<strengthValue>12</strengthValue>
<strengthUnits>h</strengthUnits>
</entryInfo>
<entryInfo>
<statusCode>completed</statusCode>
<startTime>20100412</startTime>
<endTime>20110822</endTime>
<strengthValue>8</strengthValue>
<strengthUnits>d</strengthUnits>
</entryInfo>
</medicationsInfo>
<ProductInfo>
<code>10160-0</code>
<entryInfo>
<statusCode>completed</statusCode>
<startTime>20110729</startTime>
<endTime>20110822</endTime>
<strengthValue>24</strengthValue>
<strengthUnits>h</strengthUnits>
</entryInfo>
<entryInfo>
<statusCode>completed</statusCode>
<startTime>20120130</startTime>
<endTime>20120326</endTime>
<strengthValue>12</strengthValue>
<strengthUnits>h</strengthUnits>
</entryInfo>
<entryInfo>
<statusCode>completed</statusCode>
<startTime>20100412</startTime>
<endTime>20110822</endTime>
<strengthValue>8</strengthValue>
<strengthUnits>d</strengthUnits>
</entryInfo>
</ProductInfo>
</Document>
我正在编写下面的代码来获取medicationsinfo的entryinfo结果,但我收到了错误。
代码:
Register /home/cloudera/piggybank-0.16.0.jar;
DEFINE XPathAll org.apache.pig.piggybank.evaluation.xml.XPathAll();
DEFINE XPath org.apache.pig.piggybank.evaluation.xml.XPath();
A = LOAD '/home/cloudera/Parsed_CCD.xml' using org.apache.pig.piggybank.storage.XMLLoader('medicationsInfo/entryInfo') as (x:chararray);
B = FOREACH A GENERATE XPathAll(x, 'statusCode',false,true), XPathAll(x, 'medicationsInfo/code/code',false,true).$0, XPathAll(x,'strengthValue',false,true).$1;
DUMP B;
错误:
[主要] INFO org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher - 失败了! [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1066:无法打开别名B的迭代器
预期产出:
completed 20110729 20110822 24 h
completed 20120130 20120326 12 h
completed 20100412 20110822 8 d
答案 0 :(得分:0)
下面的代码将生成预期的输出:
Register /home/cloudera/piggybank-0.16.0.jar;
DEFINE XPathAll org.apache.pig.piggybank.evaluation.xml.XPathAll();
--DEFINE XPath org.apache.pig.piggybank.evaluation.xml.XPath();
A = LOAD 'home/cloudera/Parsed_CCD.xml'
using org.apache.pig.piggybank.storage.XMLLoader('medicationsInfo') as (x:chararray);
B = FOREACH A GENERATE
XPathAll(x, 'medicationsInfo/entryInfo/statusCode').$0,
XPathAll(x, 'medicationsInfo/entryInfo/startTime').$0,
XPathAll(x, 'medicationsInfo/entryInfo/endTime').$0,
XPathAll(x, 'medicationsInfo/entryInfo/strengthValue').$0,
XPathAll(x, 'medicationsInfo/entryInfo/strengthUnits').$0;
C = FOREACH A GENERATE
XPathAll(x, 'medicationsInfo/entryInfo/statusCode').$1,
XPathAll(x, 'medicationsInfo/entryInfo/startTime').$1,
XPathAll(x, 'medicationsInfo/entryInfo/endTime').$1,
XPathAll(x, 'medicationsInfo/entryInfo/strengthValue').$1,
XPathAll(x, 'medicationsInfo/entryInfo/strengthUnits').$1;
D = FOREACH A GENERATE
XPathAll(x, 'medicationsInfo/entryInfo/statusCode').$2,
XPathAll(x, 'medicationsInfo/entryInfo/startTime').$2,
XPathAll(x, 'medicationsInfo/entryInfo/endTime').$2,
XPathAll(x, 'medicationsInfo/entryInfo/strengthValue').$2,
XPathAll(x, 'medicationsInfo/entryInfo/strengthUnits').$2;
BCD = UNION B,C,D;
DUMP BCD;