Spark小课堂Week3 FirstSparkApp(Dataframe开发)
Spark小课堂Week3 FirstSparkApp(代码优化)
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小课堂Week3 FirstSparkApp(Dataframe开发)的更多相关文章
- Spark小课堂Week3 FirstSparkApp(RDD开发)
Spark小课堂Week3 FirstSparkApp 问题:Java有哪些数据结构 大致有如下几种,其中List与Map是最重要的: List Map Set Array Heap Stack Qu ...
- Spark小课堂Week5 Scala初探
Spark小课堂Week5 Scala初探 Scala是java威力加强版. 对Java的改进 这里会结合StreamingContext.scala这个代码说明下对Java的改进方面. 方便测试方式 ...
- Spark小课堂Week2 Hello Streaming
Spark小课堂Week2 Hello Streaming 我们是怎么进行数据处理的? 批量方式处理 目前最常采用的是批量方式处理,指非工作时间运行,定时或者事件触发.这种方式的好处是逻辑简单,不影响 ...
- Spark小课堂Week1 Hello Spark
Spark小课堂Week1 Hello Spark 看到Spark这个词,你的第一印象是什么? 这是一朵"火花",官方的定义是Spark是一个高速的.通用的.分布式计算系统!!! ...
- Spark小课堂Week7 从Spark中一个例子看面向对象设计
Spark小课堂Week7 从Spark中一个例子看面向对象设计 今天我们讨论了个问题,来设计一个Spark中的常用功能. 功能描述:数据源是一切处理的源头,这次要实现下加载数据源的方法load() ...
- Spark小课堂Week6 启动日志详解
Spark小课堂Week6 启动日志详解 作为分布式系统,Spark程序是非常难以使用传统方法来进行调试的,所以我们主要的武器是日志,今天会对启动日志进行一下详解. 日志详解 今天主要遍历下Strea ...
- Spark小课堂Week4 从控制台看Spark逻辑结构
Spark小课堂Week4 从控制台看Spark逻辑结构 层级关系: 从监控控制台,我们可以看到如下关系: 一个 Job 包含 n Stage 一个 Stage 包含 n Task Job0解决什么问 ...
- 小课堂Week9 例外处理设计的逆袭Part2
小课堂Week9 例外处理设计的逆袭Part2 今天继续阅读<例外处理设计的逆袭>这本书,我们先看两个案例: 案例1 问:如果要设计一个依据学号到数据库中查询学生资料的函数,当找不到符合条 ...
- 【转载】Spark SQL 1.3.0 DataFrame介绍、使用
http://www.aboutyun.com/forum.php?mod=viewthread&tid=12358&page=1 1.DataFrame是什么?2.如何创建DataF ...
随机推荐
- CentOS中TFTP配置
转载:http://www.centoscn.com/image-text/config/2013/1105/2062.html TFTP是用来下载远程文件的最简单网络协议,它其于UDP协议而实现 1 ...
- C. Fox And Names
C. Fox And Names time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- [设计模式]<<设计模式之禅>>关于接口隔离原则
在讲接口隔离原则之前,先明确一下我们的主角——接口.接口分为两种: ● 实例接口(Object Interface),在Java中声明一个类,然后用new关键字产生一个实例,它是对一个类型的事物的描述 ...
- AI 对不起 我还爱着你
艾弗森,对不起,我还爱着你.有时候我自己都不知道自己我怎么了,直到最后才发现,我还爱着你. 那天起,我认识了你,便一发不可收拾.这些天,谢谢你,似乎因为你的影响让我改变了,坚持了许多.致以至今我才发现 ...
- linux下svn命令常用操作
1.将文件checkout到本地目录 svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain 简写:s ...
- Ionic条码扫描
http://m.blog.csdn.net/article/details?id=45843819
- 第五篇、Uber用视频播放做启动动画
import UIKit import AVFoundation class GuidePage: FxBasePage { @IBOutlet var backImageView:UIImageVi ...
- Swift标识符和关键字
任何一种计算机语言都离不开标识符和关键字,下面我们将详细介绍Swift标识符和关键字. 标示符 标识符就是给变量.常量.方法.函数.枚举.结构体.类.协议等指定的名字.构成标识符的字母均有一定的规范, ...
- iOS的沙箱目录和文件操作
一.沙箱 iOS的每一个应用程序都有自己的目录来存放数据,这个目录称为沙箱目录.沙箱目录是一种数据安全策略,它设计的原理是只能允许自己的应用访问目录,而不允许其他的应用访问,这样可以保证数据的安全,应 ...
- OC 成员变量作用域
1. 成员变量作用域: @public :在任何地方都能直接访问对象的成员变量. @private :只能在当前类的对象方法中直接访问.(@implementation中默认是@priv ...