- 数据
1010,华语剧场|剧情|当代|类型,1,0
1010,剧情|剧情|家庭剧|类型|热血,1,1
1011,华语剧场|剧情|当代|类型,1,0
1011,剧情|爱情|家庭剧|类型|热血,1,1
1012,华语剧场|剧情|当代|类型,1,0
1012,剧情|爱情|剧情|剧情|家庭剧|类型|热血,1,1
1011,华语剧场|剧情|当代|类型,1,0
1012,剧情|爱情|剧情|剧情|家庭剧|类型,1,1
1013,华语剧场|剧情|当代|类型,1,0
1013,剧情|爱情|剧情|剧情|家庭剧|热血,1,1
1014,华语剧场|剧情|当代|类型,1,0
1014,剧情|爱情|剧情|家庭剧|类型|热血,1,1
1014,华语剧场|剧情|当代|类型,1,0
1015,剧情|爱情|剧情|家庭剧|类型|热血,1,1
1016,华语剧场|剧情|当代|类型,1,1
1017,剧情|爱情|剧情|剧情,1,1
1018,华语剧场|剧情|当代|类型,1,1
1017,剧情|爱情|剧情|剧情|家庭剧,1,1
1017,华语剧场|剧情|当代|类型,1,0
1017,剧情|爱情|剧情|剧情|家庭剧|类型,1,0
1017,华语剧场|剧情|当代|类型,1,0
1016,剧情|爱情|剧情|剧情|类型|热血,1,1
1015,华语剧场|剧情|当代|类型,1,0
1014,剧情|爱情|家庭剧|类型|热血,1,0
1013,华语剧场|剧情|当代|类型,1,0
1012,剧情|剧情|家庭剧|类型|热血,1,1
1011,华语剧场|当代|类型,1,0
1011,剧情|家庭剧|类型|热血,1,0
1012,华语剧场|剧情|当代|类型,1,0
1013,剧情|爱情|剧情|剧情|家庭剧|类型|热血,1,0 - 需求
1010,华语剧场|剧情|当代|类型,1,0
数据格式说明:
id,关键字组合,使用的是|分割符,是否展示(0未展示,1展示),点击(0未点击,1点击))
要求输出:1010 关键字 展示量 点击量
输出示例:1010 华语剧场 3 2
说明:
读取文件的代码:
val lines: Iterator[String] = Source.fromFile(“impclick.txt”).getLines()
分词时,需要进行转义 \| [|] | 分不出来结果
3. 逻辑
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object DealDataExample2 {
def main(args: Array[String]): Unit = {
if (args.length!=2){
println("cn.edu360.Example.DealDataExample2 <input><output>")
sys.exit()
}
//输入参数
val Array(input,output)=args
val conf = new SparkConf()
conf.setMaster("local")
conf.setAppName(DealDataExample2.getClass.getSimpleName)
val sc = new SparkContext(conf)
//获取数据
val data: RDD[String] = sc.textFile(input)
val cutRes: RDD[((String, String), Int, Int)] = data.flatMap({
t =>
val arr = t.split(",")
val id = arr(0)
val keys = arr(1)
val glance = arr(2)
val click = arr(3)
keys.split("\\|").map({
key =>
((id, key), glance.toInt, click.toInt)
})
})
//分组聚合
val combyRes: RDD[((String, String), Iterable[((String, String), Int, Int)])] = cutRes.groupBy({
k =>
k._1
})
//求和
val sumRes: RDD[(String, String, Int, Int)] = combyRes.map({
t =>
val glance = t._2.map(t => t._2).sum
val click = t._2.map(t => t._3).sum
(t._1._1, t._1._2, glance, click)
})
//排序
val sortRes: RDD[(String, String, Int, Int)] = sumRes.sortBy(_._3)
//写出
sortRes.saveAsTextFile(output)
sc.stop()
}
}
- 结果
(1010,华语剧场,1,0)
(1016,当代,1,1)
(1011,爱情,1,1)
(1015,家庭剧,1,1)
(1018,华语剧场,1,1)
(1015,当代,1,0)
(1018,当代,1,1)
(1015,华语剧场,1,0)
(1010,家庭剧,1,1)
(1015,爱情,1,1)
(1018,类型,1,1)
(1016,爱情,1,1)
(1016,热血,1,1)
(1015,热血,1,1)
(1010,热血,1,1)
(1018,剧情,1,1)
(1010,当代,1,0)
(1016,华语剧场,1,1)
(1015,类型,2,1)
(1013,热血,2,1)
(1014,热血,2,1)
(1013,当代,2,0)
(1014,家庭剧,2,1)
(1012,爱情,2,2)
(1013,家庭剧,2,1)
(1011,热血,2,1)
(1012,热血,2,2)
(1013,爱情,2,1)
(1013,华语剧场,2,0)
(1014,爱情,2,1)
(1017,家庭剧,2,1)
(1014,华语剧场,2,0)
(1016,类型,2,2)
(1012,当代,2,0)
(1014,当代,2,0)
(1017,当代,2,0)
(1017,华语剧场,2,0)
(1012,华语剧场,2,0)
(1010,类型,2,1)
(1011,家庭剧,2,1)
(1013,类型,3,0)
(1011,当代,3,0)
(1017,类型,3,0)
(1010,剧情,3,2)
(1012,家庭剧,3,3)
(1011,华语剧场,3,0)
(1015,剧情,3,2)
(1017,爱情,3,2)
(1011,剧情,4,1)
(1014,类型,4,1)
(1016,剧情,4,4)
(1012,类型,5,3)
(1011,类型,5,1)
(1014,剧情,5,2)
(1013,剧情,8,3)
(1012,剧情,10,8)
(1017,剧情,11,6)