在Pig Latin中获取xml值

shu*_*aat 3 hadoop apache-pig xml-parsing

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

<username> Shujaat </ username>

我想得到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;
Run Code Online (Sandbox Code Playgroud)

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

Lor*_*dig 5

您提供的示例元素可以通过以下方式提取:

B = foreach A GENERATE REGEX_EXTRACT(x, '<username>(.*)</username>', 1) 
      AS name:chararray;
Run Code Online (Sandbox Code Playgroud)

像这样的嵌套元素:

  <user>
    <id>456</id>
    <username>Taylor</username>
  </user>
Run Code Online (Sandbox Code Playgroud)

可以用这样的东西提取:

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)
Run Code Online (Sandbox Code Playgroud)

您肯定需要定义一个更复杂的正则表达式,以满足您的所有需求,即:处理空元素,属性等.另一个选择是编写一个自定义UDF,它使用Java库来解析XML的内容,这样就可以避免编写(复制)复杂的,容易出错的正则表达式.