我正在尝试使用pig从配置单元表中的字段中提取一些xml,而不是从xml文件(这是我所读的大多数示例的假设)。xml来自一个如下所示的表:
ID, {XML_string}
xml字符串包含n。行数,始终包含最多10个属性中的至少一个。我们可以假设属性#1将始终存在并且是唯一的。
<row>
<att1></att1>
<att2></att2>
...
</row>
<row>
<att1></att1>
<att2></att2>
...
</row>
...
我想将其转换为一个新表,将xml字符串中的每一行分解为新表中的一个单独行,但仍然希望包含现有表中的id。
ID, att1, att2, att3
== ==== ==== ====
1 1 xxx xxx
1 2 xxx xxx
1 3 xxx xxx
2 1 xxx xxx
到目前为止,我已经在pig中使用xpathall实现了这一点。我读过很多建议,建议避免使用regex进行xml解析。
REGISTER /home/piggybank-0.12.0.jar
DEFINE XPathAll org.apache.pig.piggybank.evaluation.xml.XPathAll();
A = LOAD 'HiveTable' USING org.apache.hive.hcatalog.pig.HCatLoader();
B= FOREACH A GENERATE id,
XPathAll(xml_string,'ROW/_ATT1') as att1;
XPathAll(xml_string,'ROW/_ATT2') as att2;
XPathAll(xml_string,'ROW/_ATT3') as att3;
dump B;
假设项1有三个行示例,这将产生以下输出:
(1 (Att1-i1,Att1-i2,Att1-i3),(Att2-i1,Att2-i2,Att2-i3),(Att3-i1,Att3-i2,Att3-i3))
所有的信息似乎都在那里,我只是无法解锁将每个嵌入元组中的第一个元素拉到新行中的方法,然后是第二个元素,依此类推。换句话说:
(1, Att1-i1, Att2-i1, Att3-i1)
(1, Att1-i2, Att2-i2, Att3-i2)
(1, Att1-i3, Att2-i3, Att3-i3)
我坚持希望这可以通过使用hive+pig来完成,而不必求助于java等等。我很感激你的任何见解。我对目前所采取的方法不感兴趣,所以如果我已经走了很长的路,请告诉我!
暂无答案!
目前还没有任何答案,快来回答吧!