Apache Spark按组方法计数

时间:2017-10-02 02:06:37

标签: scala apache-spark cassandra datastax

我想使用Datastax和Spark获取Cassandra表中特定列(列“a”)的值和计数列表,但我无法确定执行该请求的正确方法。

我实际上是在尝试相当于一个T-SQL

SELECT a, COUNT(a)
FROM mytable

我在Cassandra上使用datastax和spark尝试了以下内容

import com.datastax.spark.connector._
import org.apache.spark.sql.cassandra._
val rdd = sc.cassandraTable("mykeyspace", "mytable").select("a")
rdd.groupBy(row => row.getString("a")).count()

这看起来只是给我一个列中不同值的计数,但是在列出值和这些值的计数之后我更多了(所以val1:10 ... val2:5 ... val3 :12 ......等等。我尝试了一些.collect和类似的东西;只是不确定如何在那里获得列表;任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

下面的代码片段将获取名为&#34的分区键; a"并使用" column_name"获取列并找到那个数量。

val cassandraPartitionKeys = List("a")
val partitionKeyRdd = sc.parallelize(cassandraPartitionKeys)

val cassandraRdd = partitionKeyRdd.joinWithCassandraTable(keyspace,table).map(x => x._2)

cassandraRdd.map(row => (row.getString("column_name"),1)).countByKey().collect.foreach(println)

答案 1 :(得分:0)

看起来这可能是一个部分答案(它提供了正确的数据,但可能有更好的解决方案)

import com.datastax.spark.connector._
import org.apache.spark.sql.cassandra._
val rdd = sc.cassandraTable("mykeyspace", "mytable").groupBy(row => row.getString("a"))
rdd.foreach{ row => { println(row._1 + " " + row._2.count(x => true)) } }

我假设有一个更好的解决方案,但这看起来在获得结果方面起作用。