Spark基本函数学习
package cn.itcast.spark.czh
import org.apache.spark.{SparkConf, SparkContext}
object TestFun {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("map")
val sc = new SparkContext(conf)
// val rdd = sc.parallelize(1 to 10) //创建RDD
// val map = rdd.map(_*2) //对RDD中的每个元素都乘于2
// map.foreach(x => print(x+" "))
// sc.stop()
// fun1()
// val l = List(("kpop", "female"), ("zorro", "male"), ("mobin", "male"), ("lucy", "female"))
// val rdd = sc.parallelize(l, 2)
// /*写法一*/
// // val mp = rdd.mapPartitions(fun2)
// /*val mp = rdd.mapPartitionsWithIndex(partitionsFun)*/
// // mp.collect.foreach(x => (print(x + " "))) //将分区中的元素转换成Aarray再输出
// /*写法二*/
// // rdd.mapPartitions(x=>x.filter(_._2=="female")).map(_._1).foreach(x=>print(x+" "))
// /*写法三*/
// val mp = rdd.mapPartitionsWithIndex(fun3)
// mp.collect().foreach(x => (print(x + " ")))
// fun4(sc)
fun9(sc)
}
/*map 数据集中的每个元素经过用户自定义的函数转换成一个新的RDD,新的RDD交MappedRDD*/
def fun0(): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("map")
val sc = new SparkContext(conf)
val rdd = sc.parallelize(1 to 10) //创建RDD
val map = rdd.map(_ * 2) //对RDD中的每个元素都乘于2
map.foreach(x => print(x + " "))
sc.stop()
}
/*flatMap 与map类似,但每个元素输入项都可以被映射到0或者多个输出项,最终将结果扁平化输出*/
def fun1(): Unit = {
val conf = new SparkConf().setMaster("local").setAppName("flatMap")
val sc = new SparkContext(conf)
val rdd = sc.parallelize(1 to 10)
val array = rdd.flatMap(x => (1 to x)).collect()
array.foreach(a => print(a))
}
/*mapPartitions 类似于map,map作用于每个分区的每个元素,单mapPartitions作用于每个分区工*/
def fun2(iterable: Iterator[(String, String)]): Iterator[String] = {
var woman = List[String]()
while (iterable.hasNext) {
val next = iterable.next()
next match {
case (_, "female") => woman = next._1 :: woman
case _ =>
}
}
return woman.iterator
}
/*mapPartitionsWithIndex*/
def fun3(index: Int, iterator: Iterator[(String, String)]): Iterator[String] = {
var woman = List[String]()
while (iterator.hasNext) {
val next = iterator.next()
next match {
case (_, "female") => woman = "[" + index + "]" + next._1 :: woman
case _ =>
}
}
return woman.iterator
}
/* sample 对RDD进行抽样
* 参数解释:withReplacement 为true表示抽样之后还放回RDD,可以被多次抽样,false表示不放回。
* fraction 表示抽样比例
* seed为随机数种子,比如时间戳
* */
def fun4(sc: SparkContext): Unit = {
val rdd = sc.parallelize(1 to 10)
val sample1 = rdd.sample(true, 0.5)
sample1.collect().foreach(x => print(x + " "))
sc.stop()
}
/*union 将两个RDD中的数据进行合并,并最终返回两个RDD的并集,若RDD中存在相同的元素也不会去重*/
def fun5(sc: SparkContext): Unit = {
var rdd1 = sc.parallelize(1 to 10)
var rdd2 = sc.parallelize(6 to 15)
rdd1.union(rdd2).collect().foreach(x => print(x + " "))
}
/*intersection 返回两个RDD的交集*/
def fun6(sc: SparkContext): Unit = {
val rdd1 = sc.parallelize(1 to 10)
val rdd2 = sc.parallelize(5 to 20)
rdd1.intersection(rdd2).collect().foreach(x => print(x + " "))
}
/*distinct 对RDD中的元素进行去重*/
def fun7(sc: SparkContext): Unit = {
val rdd1 = sc.parallelize(List(1, 1, 2, 3, 4, 5, 5))
rdd1.distinct().collect().foreach(x => print(x + " "))
}
/*cartesian 对两个RDD中所有的元素进行笛卡尔积操作*/
def fun8(sc : SparkContext): Unit ={
val rdd1 = sc.parallelize(1 to 3)
val rdd2 = sc.parallelize(1 to 4)
rdd1.cartesian(rdd2).collect().foreach(x=>print(x+" "))
}
/*coalesce(numPartitions,shuffle) 对RDD的分区进行重新分区,shuffle默认值为false,当shuffle=false时,不能增加分区数目,但不会报错,只是分区个数还是原来的*/
def fun9(sc :SparkContext): Unit ={
/*shuffle 为 false*/
val rdd1 = sc.parallelize(1 to 16,4)
val rdd2 = rdd1.coalesce(3)
print(rdd2.partitions.size)
}
}
Spark基本函数学习的更多相关文章
- Spark 基本函数学习笔记一
Spark 基本函数学习笔记一¶ spark的函数主要分两类,Transformations和Actions. Transformations为一些数据转换类函数,actions为一些行动类函数: ...
- Spark菜鸟学习营Day6 分布式代码运行调试
Spark菜鸟学习营Day6 分布式代码运行调试 作为代码调试,一般会分成两个部分 语法调试,也就是确定能够运行 结果调试,也就是确定程序逻辑的正确 其实这个都离不开运行,所以我们说一下如何让开发的S ...
- Spark菜鸟学习营Day5 分布式程序开发
Spark菜鸟学习营Day5 分布式程序开发 这一章会和我们前面进行的需求分析进行呼应,完成程序的开发. 开发步骤 分布式系统开发是一个复杂的过程,对于复杂过程,我们需要分解为简单步骤的组合. 针对每 ...
- Spark菜鸟学习营Day4 单元测试程序的编写
Spark菜鸟学习营Day4 单元测试程序的编写 Spark相比于传统代码是比较难以调试的,单元测试的编写是非常必要的. Step0:需求分析 在测试案例编写前,需完成需求分析工作,明确程序所有的输入 ...
- Spark菜鸟学习营Day3 RDD编程进阶
Spark菜鸟学习营Day3 RDD编程进阶 RDD代码简化 对于昨天练习的代码,我们可以从几个方面来简化: 使用fluent风格写法,可以减少对于中间变量的定义. 使用lambda表示式来替换对象写 ...
- Spark菜鸟学习营Day2 分布式系统需求分析
Spark菜鸟学习营Day2 分布式系统需求分析 本分析主要针对从原有代码向Spark的迁移.要注意的是Spark和传统开发有着截然不同的思考思路,所以我们需要首先对原有代码进行需求分析,形成改造思路 ...
- Spark菜鸟学习营Day1 从Java到RDD编程
Spark菜鸟学习营Day1 从Java到RDD编程 菜鸟训练营主要的目标是帮助大家从零开始,初步掌握Spark程序的开发. Spark的编程模型是一步一步发展过来的,今天主要带大家走一下这段路,让我 ...
- 【Spark深入学习-11】Spark基本概念和运行模式
----本节内容------- 1.大数据基础 1.1大数据平台基本框架 1.2学习大数据的基础 1.3学习Spark的Hadoop基础 2.Hadoop生态基本介绍 2.1Hadoop生态组件介绍 ...
- 【Spark 深入学习 01】 Spark是什么鬼?
经过一段时间的学习和测试,是时候给spark的学习经历做一个总结了,对于spark的了解相对晚了写.春节期间(预计是无大事),本博准备推出20篇左右spark系列原创文章(先把牛吹出去再说) ,尽量将 ...
随机推荐
- xutils3 上传文件操作——个人小计
上传文件注意: 使用KeyValue对象进行添加文件操作 int uid = 2; //普通字段的存储 requestParams.addBodyParameter("uid", ...
- [剑指offer] 10. 旋转数组的最小数字
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路: 利用dp[i]保存盖2*i的矩形有多少种办法. 通过 ...
- MySQL常用工具、日志及读写分离
MySQL常用工具.日志及读写分离 1.MySQL中常用工具 1.1 mysql 1.1.1连接选项 1.1.2 执行选项 1.2 mysqladmin 1.3 mysqlbinlog 1.4 mys ...
- [04] HEVD 内核漏洞之IntegerOverflow
作者:huity出处:https://www.cnblogs.com/huity35/p/11252574.html版权:本文版权归作者所有.文章在博客园.看雪.个人博客同时发布.转载:欢迎转载,但未 ...
- grafana 4 升级到 grafana 5错误处理
遇到2个错误: 1. UNIQUE KEY 问题 INFO[07-16|15:34:36] Executing migration logger=migrator id="Remove un ...
- DFS_全球变暖_蓝桥杯2018省赛N0.9
你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. .. ...
- JAVA-Spring AOP五大通知类型
一.前置通知 在目标方法执行之前执行的通知 在前置通知方法,可以没有参数,也可以额外接收一个JoinPoint,Spring会自动将该对象传入,代表当前的连接点,通过该对象可以获取目标对象和目标方法相 ...
- java并发程序和共享对象实用策略
java并发程序和共享对象实用策略 在并发程序中使用和共享对象时,可以使用一些实用的策略,包括: 线程封闭 只读共享.共享的只读对象可以由多个线程并发访问,但任何线程都不能修改它.共享的只读对象包括不 ...
- .NET----错误和异常处理机制
前言 错误的出现并不总是编写程序的人的原因,有时应用程序会因为应用程序的最终用户引发的动作或运行代码的环境发生错误.无论如何,我们都应预测应用程序中出现的错误,并相应的进行编码. .Net改进了处理错 ...
- java 遍历map的四种方法
16:21:42 Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,他的用途是表示一个映射项( ...