2013-06-20 82 views
1

我正在對一些數據集進行一些轉換,需要將其發佈爲一種理智的查找格式。目前我的最後一組是這樣的,當我運行形容:將袋子換成豬拉丁語

{memberId: long,companyIds: {(subsidiary: long)}} 

我需要它看起來像這樣:

{memberId: long,companyIds: [long] } 

其中companyIds的關鍵是長型的ID數組?

我真的很苦惱以這種方式操縱事物嗎?有任何想法嗎?我試過使用FLATTEN和其他命令知道有效。我使用AvroStorage將文件寫入此架構:

場模式我需要寫這個數據看起來像這樣:

"fields": [ 
     { "name": "memberId", "type": "long"}, 
     { "name": "companyIds", "type": {"type": "array", "items": "int"}} 
     ] 
+1

有豬沒有數組類型 - 我建議你寫你自己存儲功能將當前模式轉換爲更友好的文本格式 - 請參閱http://pig.apache.org/docs/r0.11.1/udf.html#load-store-functions –

+0

嗯,我會,但我想利用AvroStorage()功能。我編輯了問題以包含我的輸出模式。 – sbilstein

回答

1

我知道這是有點老了,但我最近遇到了同樣的問題。

基於avrostorage documentation,使用最新版本的pig和avrostorage,可以直接將包放到avro數組中。

在你的情況,你可能想是這樣的:

STORE blah INTO 'blah' USING AvroStorage('schema','{your schema}'); 

那裏架構中的陣列場

{ 
    "name":"companyIds", 
    "type":[ 
     "null", 
     { 
      "type":"array", 
      "items":"long" 
     } 
    ], 
    "doc":"company ids" 
} 
2

有豬(http://pig.apache.org/docs/r0.10.0/basic.html#data-types)沒有數組類型。但是,如果您只需要一個好看的輸出,並且您在companyIds中沒有太多元素,那麼您可能需要編寫一個簡單的UDF,將該包轉換爲格式良好的字符串。

Java代碼

public class BagToString extends EvalFunc<String> 
{ 
    @Override 
    public String exec(Tuple input) throws IOException 
    { 
     List<String> strings = new ArrayList<String>(); 
     DataBag bag = (DataBag) input.get(0); 
     if (bag.size() == 0) { 
      return null; 
     } 
     for (Iterator<Tuple> it = bag.iterator(); it.hasNext();) { 
      Tuple t = it.next(); 
      strings.add(t.get(0).toString()); 
     } 
     return StringUtils.join(strings, ":"); 
    } 
} 

PIG腳本

foo = foreach bar generate memberId, BagToString(companyIds);