我正在使用pig latin进行大型XML转储。我试图获得猪拉丁语中的xml节点的值。该文件就像
<用户名>&舒贾特LT; /用户名>
我想获得输入Shujaat。我尝试了piggybank XMLLoader但它只分离了xml标签及其值。代码是
register piggybank.jar;
A = load 'username.xml' using org.apache.pig.piggybank.storage.XMLLoader('username')
as (x: chararray);
B = foreach A generate x;
此代码也为我提供了用户名标签和值。我只需要价值观。知道怎么做吗?我发现了正则表达但不知道多少? 感谢
答案 0 :(得分:5)
您提供的示例元素可以通过以下方式提取:
B = foreach A GENERATE REGEX_EXTRACT(x, '<username>(.*)</username>', 1)
AS name:chararray;
这样的嵌套元素:
<user>
<id>456</id>
<username>Taylor</username>
</user>
可以通过以下方式提取:
B = foreach A GENERATE FLATTEN(REGEX_EXTRACT_ALL(x,
'<user>\\n\\s*<id>(.*)</id>\\n\\s*<username>(.*)</username>\\n\\s*</user>'))
as (id: int, name:chararray);
(456,Taylor)
您肯定需要定义一个更复杂的正则表达式,以满足您的所有需求,即:处理空元素,属性等。另一种选择是编写一个自定义UDF,它使用Java库来解析XML的内容,这样就可以避免编写(过)复杂的,容易出错的正则表达式。