数据处理案例二之数据汇总

  1. 数据
    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
  2. 需求
    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()
  }
}
  1. 结果
    (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)
问题描述: 在数据处理中经常需要对大量数据进行汇总,将相同关键字记录的某些数据项的值叠加起来,生成一个分类汇总表。 假设某超级市场销售有m种商品(假设商品的编号为1,2,3,┅┅,m),有n台前台收款机(假设收款机的编号为1,2,3,┅┅,n)进行收款,以记录的形式提供给计算机,每个记录表示某台收款机的一种商品一次交易的数量和销售额。记录由4个域组成:收款机编号、商品编号、销售数量、销售金额。构造一个结构体类型,每次销售数据以一个结构体变量保存在一个数据文件中。 实现要求: ⑴ 编写实现将数据记录插入到数据文件的最后的函数; ⑵ 编写以收款机为单位的数据分类处理函数。构造n个单链表,每个链表保存一台收款机的销售记录,这n个单链表的头指针存放在一个指针数组中,通过数组的下标就可以知道是哪台收款机。读取数据文件的记录,将所有的销售记录(数据文件中的全部记录)分解插入到n个单链表; ⑶ 统计每台收款机的销售总额; ⑷ 编写以商品为单位的数据分类处理函数。构造m个单链表,每个链表保存一种商品的销售记录,这m个单链表的头指针存放在一个指针数组中,通过数组的下标就可以知道是哪种商品。读取数据文件的记录,将所有的销售记录(数据文件中的全部记录)分解插入到m个单链表; ⑸ 以商品为单位,统计每种商品的销售总额。 ⑹ 设计一个菜单,具有插入数据记录、按收款机统计销售总额、按商品统计销售总额、退出系统等最基本的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值