package com.XXX
import org.apache.spark.storage.StorageLevel
import org.apache.spark.{SparkConf, SparkContext}
//spark中的RDD测试
object RddTest {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local[*]").setAppName("rdd api test")
val sc = SparkContext.getOrCreate(conf)
// mapTest(sc)
// distinctTest(sc)
// filterTest(sc)
// keyByTest(sc)
// sortByTest(sc)
// topNTest(sc)
// repartitionTest(sc)
// groupByTest(sc)
aggSumTest(sc)
sc.stop()
} def mapTest(sc:SparkContext) = {
val file = sc.textFile("file:///G:\\bd14\\user-logs-large.txt",3)
val mapResult = file.map(x =>{//map的特点是一个输入对应一条输出,没有返回值,对应的返回值会是() NIL
val info = x.split("\\t")
(info(0),info(1))//转换成了元组
})
//take是一个action,作用是取出前n条数据发送到driver,一般用于开发测试
mapResult.take(10).foreach(println) //map和mapPartition的区别:map是一条记录一条记录的转换,mapPartition是
//一个partition(分区)转换一次
val mapPartitionResult = file.mapPartitions(x => {//一个分区对应一个分区
var info = new Array[String](3)
for(line <- x) yield{//yield:作用:有返回值,所有的记录返回之后是一个集合
info = line.split("\\t")
(info(0),info(1))
}
})
mapPartitionResult.take(10).foreach(println)
// 把一行转为多行记录,使用flatMap展平,把一条new_tweet记录转成两条login记录
val flatMapTest = file.flatMap(x=>{
val info = x.split("\\t")
info(1) match {
case "new_tweet"=> for (i <- 1 to 2) yield s"${info(0)} login ${info(2)}"
case _ => Array(x)
}
})
flatMapTest.take(10).foreach(println)
println(file.count())
println(flatMapTest.count())
}
//distinct:排重,把重复的数据去掉,不是数据的转换,属于数据的聚合
def distinctTest(sc:SparkContext) = {
val file = sc.textFile("file:///G:\\bd14\\user-logs-large.txt",3)
val userRdd = file.map(x=>x.split("\\t")(0)).distinct()
userRdd.foreach(println)
}
//filter:过滤
def filterTest(sc:SparkContext) = {
val file = sc.textFile("file:///G:\\bd14\\user-logs-large.txt",3)
val loginFilter = file.filter(x=>x.split("\\t")(1)=="login")
loginFilter.take(10).foreach(println)
println(loginFilter.count())
} //keyBy,输入作为value,key由算计计算而来
def keyByTest(sc:SparkContext) = {
val file = sc.textFile("file:///G:\\bd14\\user-logs-large.txt",3)
val userActionType = file.keyBy(x=>{
val info = x.split("\\t")
s"${info(0)}--${info(1)}"
})
userActionType.take(10).foreach(println)
}
//sortBy排序
def sortByTest(sc:SparkContext) = {
val file = sc.textFile("file:///C:\\Users\\zuizui\\Desktop\\README.txt")
//数据量小的话,想进行群排序,吧numPartitions设置成1
//默认为圣墟,姜旭吧第二个参数设置为false
// val sortBy = file.sortBy(x=>x.split("\\s+")(1).toInt,numPartitions = 1)//后面有不同数量的空格时,使用\\s+来split
val sortBy = file.sortBy(x=>x.split("\\s+")(1).toInt,false,numPartitions = 1)//后面有不同数量的空格时,使用\\s+来split
sortBy.foreach(println)
} def topNTest(sc:SparkContext) = {
val list = List(1,23,34,54,56,100)//把集合转化为RDD使用parallelize,或者mkRDD
val rdd = sc.parallelize(list,2)
//添加饮食准换,使takeOrdered,和top的排序顺序变反
implicit val tonordered = new Ordering[Int]{
override def compare(x: Int, y: Int): Int = y.compareTo(x)
}
val takeOrdered = rdd.takeOrdered(3)//从小到大取出前三条
takeOrdered.foreach(println)
val topN = rdd.top(3)//从大到小取出前三条
topN.foreach(println)
}
//重新分区
def repartitionTest(sc:SparkContext) = {
val file = sc.textFile("file:///G:\\bd14\\user-logs-large.txt")
val result = file.repartition(5)//repartition是宽依赖,所谓宽依赖就是
//原来RDD的每一个分区中的数据都会分别吧部分数据写入到新的RDD的每个分区中
//窄依赖:就是原来RDD的分区中的一个分区数据完全写入到新的RDD中的一个分区中
//窄依赖减少网络间的传输
file.foreachPartition(x=>{
var sum = 0
x.foreach(x=>sum+=1)
println(s"该分区的数据有${sum}")
}) result.foreachPartition(x=>{
var sum = 0
x.foreach(x=>sum+=1)
println(s"该分区的数据有${sum}")
}) val coalesce = result.coalesce(3)//使用窄依赖,原来有五个分区,现在变成三个的话,
//其中的一个不变,另外四个分区中的两两分别通过窄依赖添加到另外两个新的分区中
coalesce.foreachPartition(x=>{
var sum = 0
x.foreach(x=>sum+=1)
println(s"coalesce该分区的数据有${sum}")
})
} def groupByTest(sc:SparkContext)= {
val file = sc.textFile("file:///G:\\bd14\\user-logs-large.txt")
val groupedBy = file.groupBy(x=>x.split("\\t")(0))
//group by 容易发生数倾斜
groupedBy.foreachPartition(x=>{
println(s"groupByRDD分区,该分区共有:${x.size}条记录")
})
groupedBy.foreach(x=>{
println(s"groupByRDD的一条记录,key为${x._1},value上集合记录条数是:${x._2.size}")
})
groupedBy.foreach(x => {
var sum = 0
x._2.foreach(line => {
line.split("\\t")(1) match {
case "login" => sum += 1
case _ =>
}
})
println(s"用户:${x._1}的登录次数是:$sum")
})
} def aggSumTest(sc:SparkContext) = {
val list = List(1,2,4,5)
val rdd = sc.parallelize(list,3)
//reduce 计算sum
val reduceResult = rdd.reduce((v1,v2)=>v1+v2)
//fold计算sum
val flodResult = rdd.fold(0)((v1,v2)=>v1+v2)
//aggregate把元素连接成一个字符串
val aggResult = rdd.aggregate("")((c,v)=>{
c match {
case "" => v.toString
case _ => s"$c,$v"
}
},(c1,c2)=>{
c1 match {
case ""=> c2
case _=>s"$c1,$c2"
}
}) println(s"reduceResult:$reduceResult")
println(s"flodResult:$flodResult")
println(s"aggResult:$aggResult")
} def persistTest(sc:SparkContext) = {
val file = sc.textFile("file:///G:\\bd14\\user-logs-large.txt")
// file.cache()
file.persist(StorageLevel.MEMORY_ONLY)//相当于cache(),智加载在内存中
//计算用户数量
//计算ip数量
//计算每个用户在每一个ip上的数量
}
}

spark中的scalaAPI之RDDAPI常用操作的更多相关文章

  1. linux中查看磁盘容量的常用操作

    linux中查看磁盘容量常用操作 实验室有GPU集群,用户跑数据时候跑着跑着会出现集群挂掉的问题,原因就是,在跑数据时,用户上传文件,数据集,系统产生缓存等一系列操作,消耗了集群空间,师兄让我清理下服 ...

  2. linux 中解压与压缩 常用操作详细讲解

    平时有时候 会在服务器进行一些文件的操作,比如安装一些服务与软件等等,都有解压操作,一般在 导出一些简单的服务器文件,也是先压缩后再导出,因此,在这里根据平时用到解压与压缩命令的频率来记录下: 1.最 ...

  3. Js 中对 Json 数组的常用操作

    我们首先定义一个json数组对象如下: var persons = [ {name: "tina", age: 14}, {name: "timo", age: ...

  4. ThinkPHP5.0中Request请求对象的常用操作

    获取当前系统参数 // 获取当前域名 echo '获取当前域名:'.$request->domain() . '<br/>'; // 获取当前入口文件 echo '获取当前入口文件: ...

  5. 五、mysql中sql语句分类及常用操作

    1.sql语句分类: DQL语句 数据查询语言 select DML语句 数据操作语言 insert delete update DDL语句 数据定义语言 create drop alter TCL语 ...

  6. Java中对Array数组的常用操作

    目录: 声明数组: 初始化数组: 查看数组长度: 遍历数组: int数组转成string数组: 从array中创建arraylist: 数组中是否包含某一个值: 将数组转成set集合: 将数组转成li ...

  7. Java中对List集合的常用操作

    目录: list中添加,获取,删除元素: list中是否包含某个元素: list中根据索引将元素数值改变(替换): list中查看(判断)元素的索引: 根据元素索引位置进行的判断: 利用list中索引 ...

  8. Java中对List集合的常用操作(转)

    list中添加,获取,删除元素: list中是否包含某个元素: list中根据索引将元素数值改变(替换): list中查看(判断)元素的索引: 根据元素索引位置进行的判断: 利用list中索引位置重新 ...

  9. Java中对List集合的常用操作(转载)

    目录: list中添加,获取,删除元素: list中是否包含某个元素: list中根据索引将元素数值改变(替换): list中查看(判断)元素的索引: 根据元素索引位置进行的判断: 利用list中索引 ...

随机推荐

  1. CSP(noip)中的简单对拍写法

    以a+b为例 这是随机数据 #include<iostream> #include<cstdio> #include<ctime> using namespace ...

  2. Bitnami配置域名访问

    安装完成Bitnami后,需要执行以下命令将默认目录改为/wordpress: E:\Bitnami\wordpress-5.2.2-0\apps\wordpress\bnconfig.exe --a ...

  3. C# vb .net实现缩放特效滤镜

    在.net中,如何简单快捷地实现Photoshop滤镜组中的缩放特效呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第一步 ...

  4. C#直接调用.mdf文件

    一般情况下,.mdf文件都是作为MSSQL的数据库文件,只有在安装了Microsoft SQL Server才能实现调用. 事实上,除此之外,也可以直接调用.mdf文件,而无需安装Microsoft ...

  5. python爬虫-有道翻译-js加密破解

    有道翻译-js加密破解 这是本地爬取的网址:http://fanyi.youdao.com/ 一.分析请求 我们在页面中输入:水果,翻译后的英文就是:fruit.请求携带的参数有很多,先将参数数据保存 ...

  6. Java操作JSON数据(2)--Gson操作JSON数据

    Gson是Google公司发布的一个开发源码的Java库,可用于将Java对象转换为JSON字符串,也可用于将JSON字符串转换为对应的Java对象.本介绍下Gson的基本使用方法,包括序列化和反序列 ...

  7. Thymeleaf前后端分页查询

    分页查询是一个很常见的功能,对于分页也有很多封装好的轮子供我们使用. 比如使用mybatis做后端分页可以用Pagehelper这个插件,如果使用SpringDataJPA更方便,直接就内置的分页查询 ...

  8. 科普帖:Linux操作系统

    使用计算机必然会接触操作系统,现代操作系统已经发展的十分成熟,一般用户都可以很轻松的使用计算机.然而,对于要利用计算机进行专业开发和应用的用户来说,需要更加深入地理解操作系统的原理和运行机制,这样才能 ...

  9. MySQL数据库基本规范整理

    此篇文章是学习MySQL技术整理的,不足之处还望指教,不胜感激. 数据库基本规范涉及数据库命名规范.数据库索引设计规范.数据库基本设计规范.数据库字段设计规范.数据库SQL开发规范.数据库操作行为规范 ...

  10. 【转载】C#中使用double.Parse方法将字符串转换为双精度double类型

    在C#编程过程中,很多时候涉及到数据类型的转换,例如将字符串类型的变量转换为双精度浮点类型double就是一个常见的类型转换操作,double.Parse方法是C#中专门用来将字符串转换为double ...