2013-12-11 45 views
3

,我有以下數據Hadoop的:創建空的袋子,如果字段爲空豬

id : long, 
list: {(itemId: Long, itemName: charArray)} 

在我的數據的一個例子,列表可以是元組或空袋。我想改變空到空袋(包括0元素)

我想是這樣的:

answer = FOREACH data 
GENERATE (list is null ? {} : list) AS list; 

它說,{}和列表是不兼容的架構。我想知道我怎麼可以創建一個兼容模式

我結束了一個空袋子這樣做的,它的工作:

answer = FOREACH data 
GENERATE (list is null ? (bag{tuple(long,chararray)}){} : list) AS list:{(itemId: long, itemName: charArray)}; 
+1

似乎沒有在豬0.11.0工作... –

回答

5

{}沒有類型爲是。包裏面總是有一個元組類型。 list和你的空包需要有相同的類型。

不幸的是,我沒有想到豬會以這種方式測試你,我不確定如何去做,但這將會是一些事情......我不能而她不知道如何設置一個包類型的良好的文檔......

試試這個吧?

answer = FOREACH data 
GENERATE (list is null ? (bag{tuple(long,chararray)}){} : list) AS list; 
+0

非常感謝。正在嘗試==運算符,但它不工作。這是無效檢查的完美方式。 – Raj

0

空的元組應該是()

空袋子應該是{}

空地圖應該是[]

+0

嘗試在答案中添加更多解釋。 –

3

如果你必須使用它的機會,看看Apache DataFu項目:http://datafu.incubator.apache.org

它對豬有很多有用的東西,包括datafu.pig.bags.NullToEmptyBag(),它正是你想要的:

DEFINE NullToEmptyBag datafu.pig.bags.NullToEmptyBag(); 
... 
answer = FOREACH data GENERATE NullToEmptyBag(list) AS list...; 
+1

NullToEmptyBag的另一個好處是它保留了輸入模式,所以你不必做類似下面的事情:(bag {tuple(long,chararray)}){} – matterhayes