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. git clean用法

    git clean用法   想批量删除branch中新加的文件(untracked files),,git reset --hard不行-   首先确认要删除的文件 git clean -fd -n ...

  2. c++11多线程记录1 -- std::thread

    启动一个线程 话不多说,直接上代码 void func(); int main() { std::thread t(func); //这里就开始启动线程了 t.join(); // 必须调用join或 ...

  3. MySql5.7 json查询

    create table t1(name json); insert into t1 values(’ { “hello”: “song”, “num”: 111, “obj”: { “who”: “ ...

  4. Kafka启用SASL_PLAINTEXT动态配置JAAS文件的几种方式

    Kafka是广泛使用消息服务,很多情况下关于认证部分我都是默认的配置,也就是不需要用户名/密码,也不配置证书.在内网或者在项目组内部可以,但是设计的跨部门时一般处于安全考虑都需要加上认证,防止kafk ...

  5. windows操作系统更改 <远程桌面> 端口号

    windows远程桌面连接默认使用的是3389端口,为了避免被他人扫描从而暴力破解远程服务器或者病毒入侵.可以将默认端口修改为其它端口,如8888,11111等.最好修改为10000以后的端口,这样可 ...

  6. JS中的if语句内如何加or使多个条件通过

    if(a==1&&b==2){ //do something }//条件是a等于1  并且  b等于2时才能成立,两个条件必须同时满足 if(a==1||b==2){ //do som ...

  7. tf.nn.softmax_cross_entropy_with_logits()函数的使用方法

    import tensorflow as tf labels = [[0.2,0.3,0.5], [0.1,0.6,0.3]]logits = [[2,0.5,1], [0.1,1,3]] a=tf. ...

  8. Thymeleaf前后端分页查询

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

  9. 【开发工具】 - win10设置path变量怎样列表展示?

    如果你的变量值以%开头,打开编辑的时候就会显示一串的变量值,不方便查找编辑. 所以将变量值更改为以盘符开始,就可以解决这个问题,比如:D:\apache-maven-3.6.1\bin\

  10. 利用position absolute使div居中

    外层DIV{position:realtive}内层DIV{positon:absolute;top:50%;left:50%;margin-top:-100px;margin-left:-150px ...