我们有这样的两个文件

第一个数字为行号,后边为三列数据。我们来求第二列数据的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)的功能

(5)将结果存入文件

  通过saveAsTextFile(“file://”)方法将结果存入文件

完整代码

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) //显示
})
}

注意,我们在使用sortByKey方法前,数据是分了区的

我们使用了sortByKey方法将分区了的数据进行排序可能会出错,具体原因不是很清楚。

所以有时候我们需要在sortByKey()方法前加一个.partitionBy(new HashPartitioner(1))从新分成一个区来保证正确率。

【spark】示例:求Top值的更多相关文章

  1. Sql示例说明如何分组后求中间值--【叶子】

    原文:Sql示例说明如何分组后求中间值--[叶子] 这里所谓的分组后求中间值是个什么概念呢? 我举个例子来说明一下: 假设我们现在有下面这样一个表: type        name price -- ...

  2. Spark中的键值对操作-scala

    1.PairRDD介绍     Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...

  3. Spark中的键值对操作

    1.PairRDD介绍     Spark为包含键值对类型的RDD提供了一些专有的操作.这些RDD被称为PairRDD.PairRDD提供了并行操作各个键或跨节点重新进行数据分组的操作接口.例如,Pa ...

  4. [NOI2005]维修数列 Splay tree 区间反转,修改,求和,求最值

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1500 Description Input 输入文件的第1行包含两个数N和M,N表示初始时数 ...

  5. Spark学习之键值对操作总结

    键值对 RDD 是 Spark 中许多操作所需要的常见数据类型.键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式.键值对 RDD ...

  6. Spark学习笔记——键值对操作

    键值对 RDD是 Spark 中许多操作所需要的常见数据类型 键值对 RDD 通常用来进行聚合计算.我们一般要先通过一些初始 ETL(抽取.转化.装载)操作来将数据转化为键值对形式. Spark 为包 ...

  7. 使用Scala编写Spark程序求基站下移动用户停留时长TopN

    使用Scala编写Spark程序求基站下移动用户停留时长TopN 1. 需求:根据手机基站日志计算停留时长的TopN 我们的手机之所以能够实现移动通信,是因为在全国各地有许许多多的基站,只要手机一开机 ...

  8. 堆实战(动态数据流求top k大元素,动态数据流求中位数)

    动态数据集合中求top k大元素 第1大,第2大 ...第k大 k是这群体里最小的 所以要建立个小顶堆 只需要维护一个大小为k的小顶堆 即可 当来的元素(newCome)> 堆顶元素(small ...

  9. NC15052 求最值

    NC15052 求最值 题目 题目描述 给你一个长为 \(n\) 的序列 \(a\) 定义 \(f(i,j)=(i-j)^2+g(i,j)^2\) \(g\) 是这样的一个函数 求最小的 \(f(i, ...

随机推荐

  1. java 多线程 day02 定时器

    package com.czbk.thread; import java.util.Date;import java.util.Timer;import java.util.TimerTask; /* ...

  2. jupyter常用快捷键

    Jupyter Notebook 有两种键盘输入模式.即命令模式和编辑模式,这与 vim有些类似. 在编辑模式下,可以往单元中键入代码或文本,此时单元格被绿色的框线包围,且命令模式下的快捷键不生效. ...

  3. php采集

    采集思路   采集程序的思路很简单大体可以分为以下几个步骤: 1. 获取远程文件源代码(file_get_contents或用fopen).    2.分析代码得到自己想要的内容(这里用正则匹配,一般 ...

  4. s5_day4作业

    # #流程控制练习题: # #==========>基础部分 # #练习一: # if True or False and False: # print('yes') # else: # pri ...

  5. SqlHelper简单实现(通过Expression和反射)4.对象反射Helper类

    ObjectHelper的主要功能有: 1.通过反射获取Entity的实例的字段值和表名,跳过自增键并填入Dictionary<string,string>中. namespace RA. ...

  6. 单例模式及getInstance()的用法

    一般在单例模式下使用.getInstance()创建对象:但并不是所有有私有构造方法,对外通过getInstance方法提供 实例的情况就是单例模式. 注:单例模式:一个类有且只有一个实例.1,一个私 ...

  7. 图像运动去模糊(Motion Deblurring)代码

    http://blog.csdn.net/qianliheshan/article/details/12853157 http://www.di.ens.fr/~whyte/ Efficient De ...

  8. 如何选择合适的MySQL数据类型

    一.MySQL数据类型选择原则 更小的通常更好:一般情况下选择可以正确存储数据的最小数据类型.越小的数据类型通常更快,占用磁盘,内存和CPU缓存更小. 简单就好:简单的数据类型的操作通常需要更少的CP ...

  9. 20165101 实验二 Java面向对象程序设计

    20165101 实验二 Java面向对象程序设计

  10. OpenGL核心技术之Gamma校正

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你/2.2次幂.Gamma校正后的暗红色就会成为(0.5,0.0 ...