Spark菜鸟学习营Day3 RDD编程进阶
Spark菜鸟学习营Day3
RDD编程进阶
RDD代码简化
对于昨天练习的代码,我们可以从几个方面来简化:
- 使用fluent风格写法,可以减少对于中间变量的定义。
- 使用lambda表示式来替换对象写法,可以使用到类型推断功能,减少对于类型的定义。
优化后代码如下:
return this.getInputRDD(PracticePojo.class)
.mapToPair(
practicePojo -> new Tuple2<>(practicePojo.getSecurityId(), 1))
.reduceByKey(
(v1, v2) -> v1 + v2)
.mapToPair(
tuple -> new Tuple2<>(tuple._2, tuple._1))
.sortByKey(false)
.map(
v1 -> {
PracticeResultPojo resultPojo = new PracticeResultPojo();
resultPojo.setSecurityId(v1._2);
resultPojo.setCount(v1._1);
return resultPojo;
});
Dataframe开发
在RDD的开发中,有几点问题:
- api语法较偏技术风格,相比于sql等语法来说更为底层,理解难度较高。
- 我们会发现由于RDD本身并没有固定结构,所以会使用泛型特性,引入外部结构来进行处理,这个导致了在处理过程中会涉及到大量类型相关的操作,从而增加了代码的复杂度。
所以,Spark引入了第二代api:Dataframe。
- Dataframe可以理解为一个有结构的RDD,其结构是内化的,不需要引入外部结构。
- 通过Dataframe的特性非常类似数据库的表,所以直接实现了很多数据库的操作。
练习题目
进行dataframe练习
- 读取交易记录
- 按照fundCode+securityId进行分组
- 对每个分组内的quantity进行汇总
- 输出结果
有两种写法:
写法1:
return this.getInputDataFrame(PracticePojo.class)
.groupBy("fundCode", "securityId")
.sum("quantity")
.toDF("fundCode", "securityId", "quantity");
调用dataframe的api来进行开发,我们可以发现其api比较类似sql语法的算子,api也非常的简明。相比于RDD开发,有了比较大的简化。
写法2:
return runSparkSql("select fundcode fundCode,securityid securityId,sum(quantity) quantity\n " +
" from p_table \n" +
" group by fundcode,securityid");
直接使用sql语句来开发,相比于api方式,其优点在于语法表现力更丰富,贴近原先开发习惯。
问题是:
- 因为sql语句是字符串,如有编写无法在编译时给出提示,只有在运行时才能知道异常。
- Spark支持的SQL语法不全。
小结
我们一共介绍了RDD和Dataframe两大类开发方式,各有两种开发方法:
- RDD编程
- 以对象方式传递逻辑,操作最傻瓜,代码较长,可读性差。
- 以lambda表达式传递逻辑,需要有一定的理解记忆,代码简洁,推荐使用。
- Dataframe编程
- api方式编码,相比于RDD的api更为简洁,但由于进行了封装,功能会薄弱一些。
- 调用sql语句,但是由于sql语句是字符串,可读性和可调试性较差,胜在表达能力强,并可以直接从现有系统迁移,对于存量系统迁移,推荐使用。
Spark菜鸟学习营Day3 RDD编程进阶的更多相关文章
- Spark菜鸟学习营Day1 从Java到RDD编程
Spark菜鸟学习营Day1 从Java到RDD编程 菜鸟训练营主要的目标是帮助大家从零开始,初步掌握Spark程序的开发. Spark的编程模型是一步一步发展过来的,今天主要带大家走一下这段路,让我 ...
- Spark菜鸟学习营Day2 分布式系统需求分析
Spark菜鸟学习营Day2 分布式系统需求分析 本分析主要针对从原有代码向Spark的迁移.要注意的是Spark和传统开发有着截然不同的思考思路,所以我们需要首先对原有代码进行需求分析,形成改造思路 ...
- Spark菜鸟学习营Day5 分布式程序开发
Spark菜鸟学习营Day5 分布式程序开发 这一章会和我们前面进行的需求分析进行呼应,完成程序的开发. 开发步骤 分布式系统开发是一个复杂的过程,对于复杂过程,我们需要分解为简单步骤的组合. 针对每 ...
- Spark菜鸟学习营Day4 单元测试程序的编写
Spark菜鸟学习营Day4 单元测试程序的编写 Spark相比于传统代码是比较难以调试的,单元测试的编写是非常必要的. Step0:需求分析 在测试案例编写前,需完成需求分析工作,明确程序所有的输入 ...
- Spark菜鸟学习营Day6 分布式代码运行调试
Spark菜鸟学习营Day6 分布式代码运行调试 作为代码调试,一般会分成两个部分 语法调试,也就是确定能够运行 结果调试,也就是确定程序逻辑的正确 其实这个都离不开运行,所以我们说一下如何让开发的S ...
- 【Spark 深入学习 07】RDD编程之旅基础篇03-键值对RDD
--------------------- 本节内容: · 键值对RDD出现背景 · 键值对RDD转化操作实例 · 键值对RDD行动操作实例 · 键值对RDD数据分区 · 参考资料 --------- ...
- 【spark 深入学习 05】RDD编程之旅基础篇-01
---------------- 本节内容 1.RDD的工作流程 2.WordCount解说 · shell版本WordCount · java版本WordCount -------------- ...
- 【spark 深入学习 06】RDD编程之旅基础篇02-Spaek shell
--------------------- 本节内容: · Spark转换 RDD操作实例 · Spark行动 RDD操作实例 · 参考资料 --------------------- 关于学习编程方 ...
- Learning Spark中文版--第三章--RDD编程(1)
本章介绍了Spark用于数据处理的核心抽象概念,具有弹性的分布式数据集(RDD).一个RDD仅仅是一个分布式的元素集合.在Spark中,所有工作都表示为创建新的RDDs.转换现有的RDD,或者调 ...
随机推荐
- ios菜鸟总结2
这个星期学起oc来可能是最纠结的.话不多说先补充一下上一个星期的快捷键吧.工程导航器:Command+1 显示/隐藏导航器面板:Command+0 .显示/隐藏实用工具面板:Command+Op ...
- Oracle基础 (十四)其他函数
转换函数: TO_DATE:转换为日期 --将字符串转换为日期 SELECT TO_DATE('2014-12-31', 'yyyy-mm-dd') FROM DUAL; SELECT TO_DATE ...
- JAVA 多态的一种实现
今天一个同事问我一个问题,就是关于子类,父类之间方法的调用这里的.这里我整理了一个小DEMO. 代码如下: 父类的代码: public abstract class ClassA { public f ...
- angularJS图表-angular-flot
1.首先需要在项目中引入的js文件有 <script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.mi ...
- 触发器修改后保存之前的数据 表中插入数据时ID自动增长
create or replace trigger t before update on test5 for each rowbegin insert into test55 values (:old ...
- Common工具类的验证码类的使用(未实现验证)
验证码接收 using System; using System.Collections.Generic; using System.Linq; using System.Web; using CZB ...
- OpenShare文档管理不完整功能清单
文档结构管理 以网站集-网站的方式建立各部门的文档管理中心,让文档管理更加规范,使用户更加方便地进行浏览.查找和使用文档资源. 文档全生命周期管理 结合定制开发的工作流平台对文档的全生命周期(创建.获 ...
- 微信内置浏览器中,点击下拉框出现页面乱跳转现象(iphone)
微信内置浏览器中,点击下拉框出现页面乱跳转现象(iphone) 前言: 这是小菜博客的第三篇文章.一直认为自己可以表达的东西太过简单,难以上台面,总是吝啬地不肯写.就算是写,也不知道从何开始.在同事的 ...
- 获取屏幕中某个点的RGB值与CAD屏幕像素值
'获取CAD屏幕像素的比值 Function ViewScreen() As Double Dim ScreenSize As Variant ScreenSize = ThisDrawing.Get ...
- 北大ACM(POJ1013-Counterfeit Dollar)
Question:http://poj.org/problem?id=1013 问题点:排除+验证. Memory: 244K Time: 16MS Language: C++ Result: Acc ...