我想转换输出数组:
我有以下代码:
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但找不到解决方案
提前致谢
答案 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 - 此页面上也会解释此选项。