Pig:使用嵌套对象加载xml

时间:2014-04-23 14:21:47

标签: xml apache-pig

以下xml包含类别和产品。类别我可以成功加载,但产品我不能,因为它有一个嵌套的颜色对象。我怎么能在猪身上处理这个xml?

的xml:

<?xml version="1.0" encoding="UTF-8" ?>
<Feed xmlns="http://www.xx.com/PRR/ProductFeed/1.0"
              name="xx"
              incremental="false"
              extractDate="2014-04-22T11:00:00.000000">
 <Categories>
  <Category>
   <ExternalId>2_5</ExternalId>
   <ParentExternalId></ParentExternalId>
   <Name>Baby</Name>
   <CategoryPageUrl>http://www.xx.com/en-US/Clearance/Baby-0-3yrs-Clothing.html</CategoryPageUrl>
  </Category>
  <Category>
   <ExternalId>2_3</ExternalId>
   <ParentExternalId></ParentExternalId>
   <Name>Boys 1½-12yrs</Name>
   <CategoryPageUrl>http://www.xx.com/en-US/Clearance/Boys-1H-12yrs-Clothing.html</CategoryPageUrl>
  </Category>
 </Categories>
 <Products>
  <Product>
   <ExternalId>78094</ExternalId>
   <Name>Sleep Bag</Name>
   <Description>A cover they can't throw off in the night. Pure cotton with one of our uniquely lovely prints. In its own gift box. An ultra thoughtful, luxurious present.</Description>
   <Brand>xx</Brand>
   <CategoryExternalId>1_5_1</CategoryExternalId>
   <ProductPageUrl>http://www.xx.com/en-US/Baby-0-3yrs-Accessories/78094/Baby-0-3yrs-Sleep-Bag.html</ProductPageUrl>
   <ImageUrl>http://www.xx.com/productimages/productThumb160x207/14USPR_78094_MUL.jpg</ImageUrl>
   <SwatchImageUrl>http://www.xx.com/productimages/grsw/14USPR_78094_MUL_s.jpg</SwatchImageUrl>
   <Price>54.0000</Price>
   <Wasprice>54.0000</Wasprice>
   <ManufacturerPartNumber></ManufacturerPartNumber>
   <EAN></EAN>
   <Colours>
    <Variation>
     <Tier2>MUL</Tier2>
     <Tier2Descr>Multi Elephant Party</Tier2Descr>
     <Tier2Url>http://www.xx.com/en-US/Baby-0-3yrs-Accessories/78094-MUL/Baby-0-3yrs-Multi-Elephant-Party-Sleep-Bag.html</Tier2Url>
     <Tier2ImageUrl>http://www.xx.com/productimages/productThumb160x207/14USPR_78094_MUL.jpg</Tier2ImageUrl>
     <Tier3>03 06</Tier3>
     <Tier3Descr>3-6m</Tier3Descr>
     <StockStatus>-2</StockStatus>
     <SwatchUrl>http://www.xx.com/productimages/grsw/14USPR_78094_MUL_s.jpg</SwatchUrl>
    </Variation>
    <Variation>
     <Tier2>MUL</Tier2>
     <Tier2Descr>Multi Elephant Party</Tier2Descr>
     <Tier2Url>http://www.xx.com/en-US/Baby-0-3yrs-Accessories/78094-MUL/Baby-0-3yrs-Multi-Elephant-Party-Sleep-Bag.html</Tier2Url>
     <Tier2ImageUrl>http://www.xx.com/productimages/productThumb160x207/14USPR_78094_MUL.jpg</Tier2ImageUrl>
     <Tier3>06 18</Tier3>
     <Tier3Descr>6-18m</Tier3Descr>
     <StockStatus>-2</StockStatus>
     <SwatchUrl>http://www.xx.com/productimages/grsw/14USPR_78094_MUL_s.jpg</SwatchUrl>
    </Variation>
   </Colours>
  </Product>
 </Products>
</Feed>

我用于类别的猪脚本:

REGISTER 'lib/pig/piggybank.jar'

raw = load '$INPUT_FEED' using org.apache.pig.piggybank.storage.XMLLoader('Category') 
    as (x:chararray);

raw_category = foreach raw GENERATE FLATTEN(REGEX_EXTRACT_ALL(x,
    '<Category>\\n\\s*<ExternalId>(.*)</ExternalId>\\n\\s*<ParentExternalId>(.*)</ParentExternalId>\\n\\s*<Name>(.*)</Name>\\n\\s*<CategoryPageUrl>(.*)</CategoryPageUrl>\\n\\s*</Category>'))
    as (external_id:chararray, parent_external_id:chararray, name:chararray, categorypageurl:chararray);

这是正常的,但我如何加载产品?最好的是一个加载语句中的加载类别和产品,但更糟糕的是它在两个部分也是好的。

提前致谢

更新:

最后我也能够定义嵌套字段,但只有在颜色下只有一个变体时才有效。如果我使用上面的xml它返回一个空行。如果我删除颜色下的变化(因此只剩下一个变体),那么它会正确地返回原始颜色。

任何想法我做错了什么?我希望从上面的xml中取回两行。

raw = load '$INPUT_FEED' using org.apache.pig.piggybank.storage.XMLLoader('Product') 
    as (x:chararray);

raw_product = foreach raw GENERATE FLATTEN(REGEX_EXTRACT_ALL(x,
    '<Product>\\n\\s*<ExternalId>(.*)</ExternalId>\\n\\s*<Name>(.*)</Name>\\n\\s*<Description>(.*)</Description>\\n\\s*<Brand>(.*)</Brand>\\n\\s*<CategoryExternalId>(.*)</CategoryExternalId>\\n\\s*<ProductPageUrl>(.*)</ProductPageUrl>\\n\\s*<ImageUrl>(.*)</ImageUrl>\\n\\s*<SwatchImageUrl>(.*)</SwatchImageUrl>\\n\\s*<Price>(.*)</Price>\\n\\s*<Wasprice>(.*)</Wasprice>\\n\\s*<ManufacturerPartNumber>(.*)</ManufacturerPartNumber>\\n\\s*<EAN>(.*)</EAN>\\n\\s*<Colours>\\n\\s*<Variation>\\n\\s*<Tier2>(.*)</Tier2>\\n\\s*<Tier2Descr>(.*)</Tier2Descr>\\n\\s*<Tier2Url>(.*)</Tier2Url>\\n\\s*<Tier2ImageUrl>(.*)</Tier2ImageUrl>\\n\\s*<Tier3>(.*)</Tier3>\\n\\s*<Tier3Descr>(.*)</Tier3Descr>\\n\\s*<StockStatus>(.*)</StockStatus>\\n\\s*<SwatchUrl>(.*)</SwatchUrl>\\n\\s*</Variation>\\n\\s*</Colours>\\n\\s*</Product>')) 
    as (external_id:chararray, name:chararray, description:chararray, brand:chararray, category_external_id:chararray, product_page_url:chararray, image_url:chararray, swatch_image_url:chararray, price:float, wasprice:float, manufacturer_part_number:chararray, ean:chararray, tier2:chararray, tier2desc:chararray, tier2url:chararray, tier2imageurl:chararray, tier3:chararray, tier3desc:chararray, stockstatus:chararray, swatchurl:chararray);

1 个答案:

答案 0 :(得分:0)

因此,如果xml包含名称空间,则通过pig处理xml会有一个大问题.pigbank的Xpath尚未支持此功能(我使用的是最新版本的piggybank0.14)。此外,嵌套路径遍历当前不可行(ex - / book / author / name)返回空值。

他们正在开发pig0.15中的一个功能:https://issues.apache.org/jira/browse/PIG-4355

这里他们介绍了检查命名空间的条件和解决上述问题的XpathAll UDF,但是这个版本还没有发布。虽然可以在https://github.com/apache/pig/pull/14找到补丁。

另一个选择是,您可以使用python或您熟悉的任何其他语言添加自己的UDF,它可以解析您的特定用例。