2013-08-05 33 views
0

我有一个Apache的猪问题,不知道如何解决它,或者如果可能的话。我使用hbase作为“存储层”。该表如下所示:如何在Apache Pig中加入地图? (存储在HBase中)

row key/column (b1, c1)  (b2, c2) ...  (bn, cn) 
a1    empty   empty    empty 
a2    ... 
an    ...   

有行键a1,并且每行都有与语法(bn,cn)不同的列。每行/列的值都是空的。

我的猪PROGRAMM看起来是这样的:

/* Loading the data */ 
mydata = load 'hbase://mytable' ... as (a:chararray, b_c:map[]); 

/* finding the right elements */ 
sub1 = FILTER mydata BY a == 'a1'; 
sub2 = FILTER mydata BY a == 'a2'); 

现在我想加入SUB1和SUB2,这意味着我想找到存在于两个数据SUB1和SUB2列。我怎样才能做到这一点?

回答

0

地图在纯猪中无法做到这一点。因此你将需要一个UDF。我不确定你想要作为连接的输出,但是根据你的需要调整python UDF应该相当容易。

myudf.py

@outputSchema('cols: {(col:chararray)}') 
def join_maps(M1, M2): 
    # This literally returns all column names that exist in both maps. 
    out = [] 
    for k,v in M1.iteritems(): 
     if k in M2 and v is not None and M2[k] is not None: 
      out.append(k) 
    return out 

你可以用它喜欢:

register 'myudf.py' using jython as myudf ; 

# We can call sub2 from in sub1 since it only has one row 
D = FOREACH sub1 GENERATE myudf.join_maps(b_c, sub2.b_c) ; 
+0

我的感谢。我用Java构建了一个MapToBag UDF,这对我很有用。谢谢! –