Java 使用Storm的动态枢轴

Java 使用Storm的动态枢轴,java,cassandra,pivot,apache-storm,trident,Java,Cassandra,Pivot,Apache Storm,Trident,我在bigdatadb中有行(在我的例子中是Cassandra),列名称为col1、col2、col3、val1、val2 在SQL方法中,我可以按col1、col2或col2、col1或任何其他可能的方式进行分组。这样我可以很容易地形成树层次结构 但是现在我们使用Cassandra来存储不支持分组的数据。因此,我们希望使用Storm进行分组和聚合。 我们编写了一些用于聚合和分组的示例代码,但我们无法确定是否能够实现 数据如下所示 col1,col2,col3,val1,val2 -------

我在bigdatadb中有行(在我的例子中是Cassandra),列名称为col1、col2、col3、val1、val2

在SQL方法中,我可以按col1、col2或col2、col1或任何其他可能的方式进行分组。这样我可以很容易地形成树层次结构

但是现在我们使用Cassandra来存储不支持分组的数据。因此,我们希望使用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
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
就像在excel pivot中一样,我想构建层次结构root->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(或者其他动态的东西) 在本例中,数据将如下所示

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
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
我的trident代码中有几行是这样的,它并没有像预期的那样工作

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());
为了完成上述转换,我想使用Storm,无论是否支持Trident API。
谁能指导我如何实现它?非常感谢任何计划想法。

您应该只在groupBy中包含维度(您的col1、col2和col3),而不包括度量(您的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());
它会产生如下输出,正如您所期望的那样

分区ID=0[a1、b1、21、33]

分区ID=0[a1、b2、22、103]

分区ID=0[a4,b4,99,66]

分区ID=0[a2,b1,30,44]

分区ID=0[a2,b3,22,33]

干杯

MK