3

我正在使用 pig latin 进行大型 XML 转储。我正在尝试获取猪拉丁语中 xml 节点的值。文件就像

<用户名>Shujaat</用户名>

我想得到输入 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;

这段代码也给了我用户名标签和值。我只需要价值观。知道怎么做吗?我发现了正则表达式但不太了解?谢谢

4

1 回答 1

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 的内容,这样您就可以避免编写(过度)复杂、容易出错的正则表达式。

于 2012-12-01T19:51:36.890 回答