2014-01-31 51 views
1

我排在BigData DB(卡桑德拉在我的情況),列名COL1,COL2,COL3,VAL1,VAL2動態透視使用暴風

在SQL方法,我可以通過COL1,COL2或COL2,COL1做組或者任何其他可能的方式。這樣我可以很容易地形成樹形結構。

但是現在我們使用Cassandra來存儲不支持group的數據。所以我們想用Storm來做羣組和聚合。 我們寫了一些示例代碼做聚合和分組,但我們無法形成一個意見,我們是否可以實現它。

數據看起來像這樣

col1,col2,col3,val1,val2 
------------------------ 
a1,b1,c1,10,20 
a1,b1,c2,11,13 
a1,b2,c1,9,15 
a1,b2,c3,13,88 
a2,b1,c1,30,44 
a2,b3,c2,22,33 
a4,b4,c4,99,66 

像Excel數據透視我想建立層次結構根 - > child1-> child2-> child3-VAL1,VAL2那麼它可能看起來是這樣,如果我的層次是col1- > col2-> COL3

a1   {43,136} 
    --b1  {21,33} 
     --c1 10,20 
     --c2 11,13 
    --b2  {22,103} 
     --c1 9,15 
     --c3 13,88 
a2   {52,77} 
    --b1  {30,44} 
     --c1 30,44 
    --b3  {22,33} 
    --c2 22,33 
a4   {99,66} 
    --b4  {99,66} 
     --c4 99,66 

我想給用戶的功能重新安排層次的元素像col3-> col1-> COL2(或別的東西也是,這是動態的) 在這種情況下,數據看起來像這樣

c1   {49,79} 
    --a1  {19,35} 
     --b1 10,20 
     --b2 9,15 
    --a2  {30,44} 
     --b1 30,44 
c2   {11,13} 
    --a1  {11,13} 
     --b1 11,13 
    --a2  {22,33} 
     --b3 22,33 
c3   {13,88} 
    --a1  {13,88} 
     --b2 13,88 
c4   {99,66} 
    --a4  {99,66} 
     --b4 99,66 

我的三叉戟代碼的幾行看起來像這樣,這是行不通的。

topology.newStream("aggregation", spout) 
.groupBy(new Fields("col1","col2","col3","val1","val2")) 
.aggregate(new Fields("val1","val2"), new Sum(), new Fields("val1sum","val2sum")) 
.each(new Fields("col1","col2","col3","val1sum","val2sum"), new Utils.PrintFilter()); 

爲了進行上述轉換,我希望使用帶或不帶Trident API支持的Storm。 任何人都可以指導我如何實現它?任何程序的想法都非常感謝。

回答

0

您應該只在groupBy中包含尺寸(您的col1,col2和col3)和NOT度量值(您的val1,val2)。 當你需要聚合多個度量時,你需要使用chainedAgg()構造。 以下將是拓撲改變代碼,你的使用情況:

  topology.newStream("aggregation", spout) 
    .groupBy(new Fields("col1","col2")) 
    .chainedAgg() 
    .aggregate(new Fields("val1"), new Sum(), new Fields("val1sum")) 
    .aggregate(new Fields("val2"), new Sum(), new Fields("val2sum")) 
    .chainEnd() 
    .each(new Fields("col1","col2","val1sum", "val2sum"), new Utils.PrintFilter()); 

它產生下面的輸出,就像你預期的!

的partitionid = 0,[A1,B1,21,33]

的partitionid = 0,[A1,B2,22,103]

的partitionid = 0,[A4,B4,99,66 ]

的partitionid = 0,[A2,B1,30,44]

的partitionid = 0,[A2,B3,22,33]

乾杯!

MK