Spark小课堂Week3 FirstSparkApp(Dataframe开发)
2016-07-24 14:17
405 查看
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语句是字符串,可读性和可调试性较差,胜在表达能力强,并可以直接从现有系统迁移,对于存量系统迁移,推荐使用。
关于
小课堂是在公司进行内部交流的一系列主题,偏基础,但是比较零散,持续更新中。相关文章推荐
- CAAnimation简介
- 基于Phaser框架完成FlappyBird
- Spark小课堂Week3 FirstSparkApp(RDD开发)
- MediaPlayer类的使用
- AndroidStudio检测不到模拟器的解决方案(百试不爽)
- Mapper映射语句高阶应用——ResultMap
- android绘图基础
- Android自定义控件----高仿Android酷狗播放条(YluoSeekBar)
- unity NGUI图文混排
- Android HTML 中添加空格
- Android之多线程下载及断点续传
- 开发日记——手机安全卫士 Day01 2016-7-20 完成主界面和设置密码功能
- BitmapFactory类
- android接收短信(SmsMessage.createFromPdu((byte[])obj)不推荐使用的处理方法)
- android studio的使用之ADB无法启动
- Android最佳性能实践(四)——布局优化技巧
- 三十天完成一个Android项目(Android应用程序的构成)
- Android Service 服务的基本用法
- Android最佳性能实践(三)——高性能编码优化
- Android最佳性能实践(二)——分析内存的使用情况