以下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);
答案 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,它可以解析您的特定用例。