猪负载阵列到mongo

时间:2014-08-29 11:54:13

标签: mongodb apache-pig

我想转换输出数组:

我有以下代码:

x = LOAD '$INPU'
            USING PigStorage('\\u001')
            AS (
                  product_id:chararray,
                  size:chararray
                 );

grouped = GROUP x BY (product_id);

 sizes = FOREACH grouped {
                       sizes = DISTINCT $1.size;
                       GENERATE
                         $0 AS product_id,
                         sizes AS sizes;
                     }

 output = foreach sizes generate
    product_id as id,
    sizes as sizes;

STORE output
INTO '$output'
USING com.mongodb.hadoop.pig.MongoInsertStorage('id');

结果如下:

"product_id" :"123",
"sizes": [ 
{
"size": "X"
},
{
"size": "M"
},
{
"size": "L"
}
]

可以将输出更改为以下内容吗? :

product_id: "123",
sizes": ["X", "M", "L"]

我试过flatten和BagToTuple但找不到解决方案

提前致谢

1 个答案:

答案 0 :(得分:0)

您可能已经看过它了,但this page on mongodb.hadoop详细解释了这个问题,并举例说明了如何使用 MongoInsertStorage (以及 MongoUpdateStorage )。

我不得不承认,我没有看到一个可以做你喜欢的选择;事实上,在他们的例子中,他们得到了类似的结果。

但是,可能有用的事情是使用 MongoUpdateStorage 来进行upsert。我不确定它是否可行,但是如果你在新的或空的集合上使用没有参数的通用查询,它就可以完成这项工作。如果你查看我提供的链接的底部,他们会解释如何获得看起来像这样的输出

  

{" _id" :ObjectId(" ......"),"性别":"男","年龄" :19,"汽车" :[" a"," b"," c"],"第一" :" Daniel"," last" :" Alabi" }

而不是

  

{" _id" :ObjectId(" ......"),"性别":"男","年龄" :19,"汽车" :[{" car":" a"},{" car":" b"},{" car&#34 ;:" c"}],"第一" :" Daniel"," last" :" Alabi" }

(我指的是 cars 字段中的更改)。

最后一个问题 - 在您的示例中,您在上一个 foreach 中将 product_id 的名称更改为 id ...但是在您显示的输出,它仍然具有名称​​ product_id 。可能是你一直在向 MongoInsertStorage发送错误的关系吗?

最后,另一个选择是将您的收藏保存为BSON,然后在其上使用 mongorestore - 此页面上也会解释此选项。