Spark高级函数应用【combineByKey、transform】
一.combineByKey算子简介
功能:实现分组自定义求和及计数。
特点:用于处理(key,value)类型的数据。
实现步骤:
1.对要处理的数据进行初始化,以及一些转化操作
2.检测key是否是首次处理,首次处理则添加,否则则进行分区内合并【根据自定义逻辑】
3.分组合并,返回结果
二.combineByKey算子代码实战
package big.data.analyse.scala.arithmetic import org.apache.spark.sql.SparkSession
/**
* Created by zhen on 2019/9/7.
*/
object CombineByKey {
def main (args: Array[String]) {
val spark = SparkSession.builder().appName("CombineByKey").master("local[2]").getOrCreate()
val sc = spark.sparkContext
sc.setLogLevel("error") val initialScores = Array((("hadoop", "R"), 1), (("hadoop", "java"), 1),
(("spark", "scala"), 1), (("spark", "R"), 1), (("spark", "java"), 1)) val d1 = sc.parallelize(initialScores) val result = d1.map(x => (x._1._1, (x._1._2, x._2))).combineByKey(
(v : (String, Int)) => (v : (String, Int)), // 初始化操作,当key首次出现时初始化以及执行一些转化操作
(c : (String, Int), v : (String, Int)) => (c._1 + "," + v._1, c._2 + v._2), // 分区内合并,非首次出现时进行合并
(c1 : (String,Int),c2 : (String,Int)) => (c1._1 + "," + c2._1, c1._2 + c2._2)) // 分组合并
.collect() result.foreach(println)
}
}
三.combineByKey算子执行结果

四.transform算子简介
在spark streaming中使用,用于实现把一个DStream转化为另一个DStream。
五.transform算子代码实现
package big.data.analyse.streaming
import org.apache.log4j.{Level, Logger}
import org.apache.spark.SparkConf
import org.apache.spark.streaming.{Seconds, StreamingContext}
/**
* Created by zhen on 2019/09/21.
*/
object StreamingSocket {
def functionToCreateContext():StreamingContext = {
val conf = new SparkConf().setMaster("local[2]").setAppName("StreaingTest")
val ssc = new StreamingContext(conf, Seconds(10))
val lines = ssc.socketTextStream("192.168.245.137", 9999)
val words = lines.flatMap(_.split(" "))
val pairs = words.map(word=>(word,1))
/**
* 过滤内容
*/
val filter = ssc.sparkContext.parallelize(List("money","god","oh","very")).map(key => (key,true))
val result = pairs.transform(rdd => { // transform:把一个DStream转化为另一个SDtream
val leftRDD = rdd.leftOuterJoin(filter)
val word = leftRDD.filter( tuple =>{
val y = tuple._2
if(y._2.isEmpty){
true
}else{
false
}
})
word.map(tuple =>(tuple._1,1))
}).reduceByKey(_+_)
result.foreachRDD(rdd => {
if(!rdd.isEmpty()){
rdd.foreach(println)
}
})
ssc.checkpoint("D:\\checkpoint")
ssc
}
Logger.getLogger("org").setLevel(Level.WARN) // 设置日志级别
def main(args: Array[String]) {
val ssc = StreamingContext.getOrCreate("D:\\checkpoint", functionToCreateContext _)
ssc.start()
ssc.awaitTermination()
ssc.stop()
}
}
六.transform算子执行结果
输入:
输出:

备注:若在执行流计算时报:Some blocks could not be recovered as they were not found in memory. To prevent such data loss, enable Write Ahead Log (see programming guide for more details.,可以清空checkpoint目录下对应的数据【当前执行生成的数据】,可以解决这个问题。
Spark高级函数应用【combineByKey、transform】的更多相关文章
- Spark核心RDD:combineByKey函数详解
https://blog.csdn.net/jiangpeng59/article/details/52538254 为什么单独讲解combineByKey? 因为combineByKey是Spark ...
- spark aggregate函数详解
aggregate算是spark中比较常用的一个函数,理解起来会比较费劲一些,现在通过几个详细的例子带大家来着重理解一下aggregate的用法. 1.先看看aggregate的函数签名在spark的 ...
- Spark高级数据分析——纽约出租车轨迹的空间和时间数据分析
Spark高级数据分析--纽约出租车轨迹的空间和时间数据分析 一.地理空间分析: 二.pom.xml 原文地址:https://www.jianshu.com/p/eb6f3e0c09b5 作者:II ...
- javascript高级函数
高级函数 安全的类型检测 js内置的类型检测并非完全可靠,typeof操作符难以判断某个值是否为函数 instanceof在多个frame的情况下,会出现问题. 例如:var isArray = va ...
- js 高级函数 之示例
js 高级函数作用域安全构造函数 function Person(name, age) { this.name = name; this.age = age; ...
- 浅谈JS中的高级函数
在JavaScript中,函数的功能十分强大.它们是第一类对象,也可以作为另一个对象的方法,还可以作为参数传入另一个函数,不仅如此,还能被一个函数返回!可以说,在JS中,函数无处不在,无所不能,堪比孙 ...
- php一些高级函数方法
PHP高级函数 1.call_user_func (http://php.net/manual/zh/function.call-user-func.php) 2.get_class (http:// ...
- Spark 用户自定义函数 Java 示例
Spark UDF Java 示例 在这篇文章中提到了用Spark做用户昵称文本聚类分析,聚类需要选定K个中心点,然后迭代计算其他样本点到中心点的距离.由于中文文字分词之后(n-gram)再加上昵称允 ...
- Python函数式编程(二):常见高级函数
一个函数的参数中有函数作为参数,这个函数就为高级函数. 下面学习几个常见高级函数. ---------------------------------------------------------- ...
随机推荐
- P3258 [JLOI2014]松鼠的新家题解
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有\(n\)个房间,并且有\(n-1\)根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树& ...
- 洛谷 P2580 【于是他错误的点名开始了】题解
XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛CON900). 题目背景 ...
- iptables 表和链的对应关系
filter表 主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP.ACCEPT.REJECT.LOG).filter 表对应的内核模块为iptable_filter,包含三个规 ...
- Redis有效时间设置及时间过期处理
本文对redis的过期处理机制做个简单的概述,让大家有个基本的认识. Redis中有个设置时间过期的功能,即对存储在redis数据库中的值可以设置一个过期时间.作为一个缓存数据库,这是非常实用的.如我 ...
- java web开发入门二(struts)基于eclispe
JavaBean JavaBean, 咖啡豆. JavaBean是一种开发规范,可以说是一种技术. JavaBean就是一个普通的java类.只有符合以下规定才能称之为javabean: 1)必须提 ...
- 使用PhantomJS后台web界面截图
自动化截web页面的图 一.工具介绍: PhantomJS是一个基于webkit的JavaScript API.它使用QtWebKit作为它核心浏览器的功能,使用webkit来编译解释执行JavaSc ...
- prometheus自定义监控指标——入门
grafana结合prometheus提供了大量的模板,虽然这些模板几乎监控到了常见的监控指标,但是有些特殊的指标还是没能提供(也可能是我没找到指标名称).受zabbix的影响,自然而然想到了自定义监 ...
- Kafka支持单集群20万分区
Kafka支持单集群20万分区 之前网上关于确定Kafka分区数的博客多多少少都源自于饶军大神的文章,如今他带来了这方面的第二篇文章,特此翻译一下,记录一下其中的要点. 原贴地址: https://w ...
- php 跳出循环 break
break语句可以带一个参数n,表示跳出循环的层数,如果要跳出多重循环的话,可以用n来表示跳出的层数,如果不带参数默认是跳出本重循环.
- DELPHI网页开发神器UNIGUI的安装与演示
UNIGUI安装和演示 uniGUI v1.0.0.1397(带注册机).rar在delphi10.2安装 提示:安装包可以自行在网上搜索下载,或者联系我获取都可以 这里讲下怎样安装的方法: 1)执行 ...