如何使用spark java api在cassandra表中进行像avg,max sum这样的加法

时间:2018-02-20 13:26:45

标签: java apache-spark cassandra datastax datastax-java-driver

我在cassandra db中拥有大量数据,我想使用spark java api进行某些列名称的avg,max和sum的聚合

我试过以下

cassandraRowsRDD
  .select("name", "age", "ann_salaray", "dept","bucket", "resourceid", "salaray")
  .where("timestamp = ?", "2018-01-09 00:00:00")
  .withAscOrder()

我看到了这个方法 - .aggregate(zeroValue,seqOp,combOp),但不知道如何使用它

预期:

max(salary column name)
avg(salary column name)

我尝试使用CQL,因为数据量巨大而失败

任何人都可以给我一个使用spark java api

在cassandra表中进行聚合的示例

1 个答案:

答案 0 :(得分:2)

第一个参数提供所谓的“零值”,用于初始化“累加器”,第二个参数 - 带累加器和放大器的功能。来自RDD的单个值,以及第三个参数 - 需要2个累加器并将它们组合起来的函数。

对于您的任务,您可以使用类似的东西(伪代码)

res = rdd.aggregate((0,0,0),
   (acc, value) => (acc._1 + 1,
                    acc._2 + value.salary,
                    if (acc._3 > value.salary) then acc._3 else value.salary),
   (acc1, acc2) => (acc1._1 + acc2._1,
                    acc1._2 + acc2._2,
                    if (acc1._3 > acc2._3) then acc1._3 else acc2._3))
 val avg = res._2/res._1
 val max = res._3

在这种情况下,我们有:

  1. (0,0,0) - 3个元素的元组,相应地表示:RDD中的元素数,所有工资的总和,以及最高工资
  2. 从累加器生成新元组的功能&值
  3. 结合2个元组的功能
  4. 然后有多个条目,工资全额和最高,我们可以找到所有必要的数据。