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,或者调 ...
随机推荐
- [JavaEE] SSH框架笔记_eclipse搭建SSH框架详解
SSH框架是最常用的框架之一,在搭建SSH框架的时候总有人遇到这样,那样的问题.下面我介绍一下SSH框架搭建的全过程. 第一步:准备工作. 下载好eclipse,Struts2,Spring,Hibe ...
- Oracle基础 shutdown和startup
一.shutdown命令:SHUTDOWN有四个参数:NORMAL.TRANSACTIONAL.IMMEDIATE.ABORT.缺省不带任何参数时表示是NORMAL. SHUTDOWN NORMAL: ...
- Umbraco列表分页
展示型文章经常会遇到分页的问题,以下是我的解决方法: ; ; int.TryParse(Request.QueryString["page"], out page); var to ...
- hdu 1243 反恐训练营 最长公共字序列
此题的题意很明确,就是求最长公共子序列: #include<iostream> #include<algorithm> #include<cstdio> #incl ...
- OpenShare新功能@2014年11月 [2014-11-30]
新功能@Nov,2014 各门户层次主页布局自由编辑:升级为实时保存,这样用户编辑门户主页时,就算忘了点击“保存布局信息”,也不会丢失已做的工作 全方位支持匿名访问,支持构造公网以及extranet网 ...
- 未能加载文件或程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad
遇到这个报错是在服务器上的,将一个网站发布到服务器.在本地的运行时正常的,但在服务器上是报错的. 原因是服务器上是没有安装Microsoft.Web.Infrastructure.然而,处理这个问题也 ...
- 七. CSS字体
概述 所谓字体:即文字的形体结构,根据外观字体分不同的类别:衬线字体Serif.无衬线字体sans-serif和等宽字体monospace.每一个类别的字体又可以分成不同的字体族font family ...
- windows Api AlphaBlend的使用方法
很早的时候公司里开发了个c++客户端软件,需要支持windows2000,要求简单小巧,并且不希望引入其他界面库,图形引擎之类的东西,像gdi+之类的,于是对于美工做出来的一些界面,需要有alpha通 ...
- 利用 Google API 调用谷歌地图 演示1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- UI4_注册登录界面
// // ViewController.h // UI4_注册登录界面 // // Created by zhangxueming on 15/7/3. // Copyright (c) 2015年 ...