码迷,mamicode.com
首页 > 其他好文 > 详细

【spark】示例:求Top值

时间:2018-05-14 11:40:31      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:正序   new   排序   数据   取数据   src   一个   error   import   

我们有这样的两个文件

技术分享图片技术分享图片

第一个数字为行号,后边为三列数据。我们来求第二列数据的Top(N)

(1)我们先读取数据,创建Rdd

技术分享图片

(2)过滤数据,取第二列数据。

技术分享图片

我们用filter()来过滤数据

line.trim().length是除去行末尾的空格然后计算长度,长度大于0,并且分能用逗号切分为4个子数据的数据为有效数据。

然后我们来切分取出第二列数据,即arr(2),arr(0)为行号

line.map(_.split(",")(2))

(3)数据类型转换并修改成键值对的形式

技术分享图片

我们通过.map(x=>(x.toInt,""))把原来数据(string)修改成为(int,String)类型的键值对

为什么要这么做呢?因为我们要采用orderByKey()方法进行排序。

(4)排序取出键值对中的键

我们先调用orderByKey(false)方法对rdd中的每个键值对按照键值进行排序,false参数:是否正序

然后我们通过 x=>x._1 取排序后的键值对的键,最后通过take(N)方法即可实现取TOP(N)的功能

技术分享图片

完整代码

 

import org.apache.spark.{SparkConf, SparkContext}

object TopN {
    //建立SparkContext
    val sparkConf = new SparkConf().setAppName("TopN")
    val sc = new SparkContext(sparkConf)
    //设置日志等级,只显示报错
    sc.setLogLevel("ERROR")
    //读取数据,分区
    val lines = sc.textFile("hdfs://localhost:9000/user/local/spark/data",2)
    var num = 0//排名初始化
    var result = lines.filter(line => (line.trim.length > 0 && line.split(",").length > 4))//过滤数据
                      .map(_.split(",")(2)) //拆分文件取第二列数
                      .map(x =>(x.toInt,"")) //修改数据类型并转化为键值对的形式
                      .sortByKey(false)//排序
                      .map(x => x._1)//取键
                      .take(5)//取前五条数据
                      .foreach( x =>{ //显示数据
                            num = num + 1 //排名
                            println(num+"\t"+x) //显示
    })
}

  

【spark】示例:求Top值

标签:正序   new   排序   数据   取数据   src   一个   error   import   

原文地址:https://www.cnblogs.com/zzhangyuhang/p/9035042.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!