2014-08-29 5 views
0

Я хотел бы превратить свой выходной массив:массив нагрузки 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"] 

я попытался придавить и BagToTuple, но не смог найти решение

заранее спасибо

ответ

0

Вы, наверное, уже видели, но this page on mongodb.hadoop объясняет в мельчайших подробностях, и с примерами, как использовать MongoInsertStorage (а также MongoUpdateStorage).

Должен признаться, я не видел там возможности делать то, что хотел; действительно, в их примере они получают аналогичный результат для вас.

Однако, на работе, которая может работать, необходимо использовать MongoUpdateStorage, чтобы сделать upserts. Я не уверен, что это сработает, но если вы используете общий запрос без параметров в новой или пустой коллекции, он может выполнить эту работу. Если вы посмотрите на нижнюю часть ссылки, которую я предоставил, они объясняют, как получить вывод, который выглядит следующим образом:

{"_id": ObjectId ("..."), "gender": "male" , «возраст»: 19, «автомобили»: [«a», «b», «c»], «first»: «Daniel», «last»: «Alabi»}

вместо этого

{"_id": ObjectId ("..."), "gender": "male", "age": 19, "cars": [{"car": "a"}, { «автомобиль»: «b»}, {«автомобиль»: «c»}], «первый»: «Даниэль», «последний»: «Алаби»}

(Я имею в виду изменение в автомобилей).

последний вопрос - в вашем примере, вы измените имя PRODUCT_ID к ид в последнем Еогеасп ... но на выходе вы показали, что до сих пор носит название PRODUCT_ID. Может быть, вы отправили неправильное отношение к MongoInsertStorage?

И, наконец, еще один вариант, чтобы сохранить свою коллекцию как BSON, а затем использовать mongorestore на нем - эта опция также объяснен на этой странице.

+0

Я использую обновление mongo, чтобы упростить проблему, которую я использовал в этом примере. – clairvoyant

+0

и есть ли способ создать список строк просто? как размеры: X, M, L? – clairvoyant

+0

Можете ли вы включить команду обновления, которую вы использовали в своем вопросе? – Eyal

Смежные вопросы