我的RDD
类型为RDD[Map]
,map
格式如下:
{"date": "2015-01-01", "topic": "sports", "content": "foo,bar"}
...
现在我想获得一个像
这样的序列 {"date": "2015-01-01", "topic":"sports", "count":22}
即每天每个主题的计数。
如何在Spark
中对其进行分组和统计?
答案 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,它将很容易适应您的语言。
此外,请注意我输入的导入,因为必须在RDD
和PairRDD
之间进行隐式转换。