我正在尝试使用 PIG 从 Hive 表中的字段而不是从 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 等。我将不胜感激任何见解。我对迄今为止采取的方法并不珍惜,所以如果我走了很长的路,请告诉我!