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. JVM知识点总览-高级Java工程师面试必备

    jvm 总体梳理 jvm体系总体分四大块: 类的加载机制 jvm内存结构 GC算法 垃圾回收 GC分析 命令调优 当然这些知识点在之前的文章中都有详细的介绍,这里只做主干的梳理 这里画了一个思维导图, ...

  2. cisco ap客户端无规律掉线

    设备 cisco air-ct2504-50-k9 cisco air-ap1832I-H-k9 首先根据这个帖子 https://community.cisco.com/t5/other-wirel ...

  3. [转帖]Exadata X8发布

    Exadata X8发布 2019-04-09 10:45:32 dingdingfish 阅读数 193 文章标签: ExadataOracleX8 更多 分类专栏: Exadata   版权声明: ...

  4. day54——jquery补充、bootstrap

    day54 jquery 页面载入 window.onload: 原生js的window.onload事件:// onload 等待页面所有内容加载完成之后自动触发的事件 window.onload ...

  5. Java 中的 equals,==与 hashCode 的区别与联系

    一. 关系操作符 ==:若操作数的类型是基本数据类型,则该关系操作符判断的是左右两边操作数的值是否相等若操作数的类型是引用数据类型,则该关系操作符判断的是左右两边操作数的内存地址是否相同.也就是说,若 ...

  6. 配置 web 内容的访问

    在您的 system1 上的 web 服务器的 DocumentRoot 目录下,创建一个名为 private 的目录,要求如下: 1.从 http://server.group8.example.c ...

  7. git 学习笔记 ---解决冲突

    人生不如意之事十之八九,合并分支往往也不是一帆风顺的. 准备新的feature1分支,继续我们的新分支开发: $ git checkout -b feature1 Switched to a new ...

  8. java之hibernate之加载策略和抓取策略

    1.加载策略:指hibernate查询数据时,采用什么样的方式将数据写入内存.Hibernate中提供了两种方式来加载数据:懒加载和即时加载. 2.懒加载又称延迟加载,指使用hiberante API ...

  9. 利用windows服务实现整点报时功能

    程序语言:C# 实现目标:程序托管自动运行,每到整点播放语音报时. 准备素材:00——23点的整点报时声音文件. 实现过程: 1.新建windows服务项目 2.添加安装程序 3.设置服务属性 [添加 ...

  10. 自己用JQueryUI封装了几个系统常用对话框

    /* * @功能描述:各种系统消息框 * @前置插件:JQueryUI * @开 发 者:魏巍 * @开发日期:2015-04-15 * @version 1.0 */ var SF = {}; SF ...