在Pig Latin中获取xml值

时间:2012-12-01 11:12:38

标签: hadoop xml-parsing apache-pig

我正在使用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;

此代码也为我提供了用户名标签和值。我只需要价值观。知道怎么做吗?我发现了正则表达但不知道多少? 感谢

1 个答案:

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