spark中的scalaAPI之RDDAPI常用操作
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常用操作的更多相关文章
- linux中查看磁盘容量的常用操作
linux中查看磁盘容量常用操作 实验室有GPU集群,用户跑数据时候跑着跑着会出现集群挂掉的问题,原因就是,在跑数据时,用户上传文件,数据集,系统产生缓存等一系列操作,消耗了集群空间,师兄让我清理下服 ...
- linux 中解压与压缩 常用操作详细讲解
平时有时候 会在服务器进行一些文件的操作,比如安装一些服务与软件等等,都有解压操作,一般在 导出一些简单的服务器文件,也是先压缩后再导出,因此,在这里根据平时用到解压与压缩命令的频率来记录下: 1.最 ...
- Js 中对 Json 数组的常用操作
我们首先定义一个json数组对象如下: var persons = [ {name: "tina", age: 14}, {name: "timo", age: ...
- ThinkPHP5.0中Request请求对象的常用操作
获取当前系统参数 // 获取当前域名 echo '获取当前域名:'.$request->domain() . '<br/>'; // 获取当前入口文件 echo '获取当前入口文件: ...
- 五、mysql中sql语句分类及常用操作
1.sql语句分类: DQL语句 数据查询语言 select DML语句 数据操作语言 insert delete update DDL语句 数据定义语言 create drop alter TCL语 ...
- Java中对Array数组的常用操作
目录: 声明数组: 初始化数组: 查看数组长度: 遍历数组: int数组转成string数组: 从array中创建arraylist: 数组中是否包含某一个值: 将数组转成set集合: 将数组转成li ...
- Java中对List集合的常用操作
目录: list中添加,获取,删除元素: list中是否包含某个元素: list中根据索引将元素数值改变(替换): list中查看(判断)元素的索引: 根据元素索引位置进行的判断: 利用list中索引 ...
- Java中对List集合的常用操作(转)
list中添加,获取,删除元素: list中是否包含某个元素: list中根据索引将元素数值改变(替换): list中查看(判断)元素的索引: 根据元素索引位置进行的判断: 利用list中索引位置重新 ...
- Java中对List集合的常用操作(转载)
目录: list中添加,获取,删除元素: list中是否包含某个元素: list中根据索引将元素数值改变(替换): list中查看(判断)元素的索引: 根据元素索引位置进行的判断: 利用list中索引 ...
随机推荐
- 关于docker的scratch镜像与helloworld
关于docker的scratch镜像与helloworld 参考:https://hub.docker.com/_/scratch?tab=description 参考:https://segment ...
- vue中methods、computed、watch区别
vue中methods.computed.watch区别methods:事件调用的钩子 computed:{ // 计算属性是根据他依赖的值计算的,当依赖值发生变化,其跟着改变 // 计算属性是依赖缓 ...
- redis 设置自启动
redis 设置自启动 1.创建服务(redis.conf 配置文件要注意,经过cp产生了很多个redis.conf) vim /lib/systemd/system/redis.service [U ...
- (转)为什么ssh一关闭,程序就不再运行了?
ref :https://www.cnblogs.com/lomper/p/7053694.html 问题描述 当SSH远程连接到服务器上,然后运行一个程序,eg: ./test.sh, 然后把终端开 ...
- JVM与并发
1.jvm内存模型 硬件内存模型 处理器-->高速缓存-->缓存一致性协议-->主存 java内存模型 线程<-->工作内存<-->save和load < ...
- React 语法
1.JavaScript XML JSX = JavaScript XML,是一个看起来很像 XML 的 JavaScript 语法扩展.JSX 不是模板,是JS语法本身,有更多的扩展.JSX 组件一 ...
- idea使用git进行项目管理
第一部分: 安装 1. 下载地址: https://git-scm.com/download/win; 如果速度慢, 使用 迅雷下载; 2. 点击安装, 然后下一步, 直到下面这个页面: 建议: 按 ...
- dump net core lldb 分析
原文https://www.cnblogs.com/calvinK/p/9274239.html centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试) 写个dem ...
- java中四种权限修饰符区别
总的概括:public > protected > (default) > private 细分见下表格: 权限修饰符 public protected (default) priv ...
- 2019 斗鱼java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.斗鱼等公司offer,岗位是Java后端开发,因为发展原因最终选择去了斗鱼,入职一年时间了,之前面试了很多家公 ...