Spark:如何对满足特定条件的RDD进行分组和计数?

时间:2015-12-24 14:37:39

标签: apache-spark rdd

我的RDD类型为RDD[Map]map格式如下:

{"date": "2015-01-01", "topic": "sports", "content": "foo,bar"}
 ...

现在我想获得一个像

这样的序列

{"date": "2015-01-01", "topic":"sports", "count":22}

即每天每个主题的计数。

如何在Spark中对其进行分组和统计?

2 个答案:

答案 0 :(得分:0)

下面是在spark 1.3.0上使用spark sql的代码,这段代码经过了很好的测试,如果你熟悉sql,你可以编写简单的查询来处理你的JSON数据。请注意,最新版Spark中的语法略有不同(例如:1.5):

Save file to HDFS (eg: /user/cloudera/data.json)

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
sqlContext.sql("set spark.sql.shuffle.partitions=10");
-- You can change number of partitions to the number you want, by default it will use 200
import sqlContext.implicits._
val jsonData = sqlContext.jsonFile("/user/cloudera/data.json")
jsonData.registerTempTable("jsonData")
val tableData=sqlContext.sql("select \"date\", topic, count(1) from jsonData group by \"date\", topic")
tableData.collect().foreach(println)

答案 1 :(得分:0)

如果Map是包含您显示的字段的对象,则可以执行以下操作:

 import org.apache.spark.SparkContext._

 resultRDD=yourRDD.map( x => ((x.date,x.topic), 1)).reduceByKey(_+_)
 resultRDD.map (
  x =>
   // here you have to create the JSON you want as output
   // knowing that x._1._1 contains the date, x._1._2 contains the topic
   // and x._2 contains the count
 )

我在Scala中编写的代码,但我确信如果您使用的是Java或Python,它将很容易适应您的语言。

此外,请注意我输入的导入,因为必须在RDDPairRDD之间进行隐式转换。