Spark菜鸟学习营Day3

RDD编程进阶

RDD代码简化

对于昨天练习的代码,我们可以从几个方面来简化:

  1. 使用fluent风格写法,可以减少对于中间变量的定义。
  2. 使用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的开发中,有几点问题:

  1. api语法较偏技术风格,相比于sql等语法来说更为底层,理解难度较高。
  2. 我们会发现由于RDD本身并没有固定结构,所以会使用泛型特性,引入外部结构来进行处理,这个导致了在处理过程中会涉及到大量类型相关的操作,从而增加了代码的复杂度。

所以,Spark引入了第二代api:Dataframe。

  1. Dataframe可以理解为一个有结构的RDD,其结构是内化的,不需要引入外部结构。
  2. 通过Dataframe的特性非常类似数据库的表,所以直接实现了很多数据库的操作。

练习题目

进行dataframe练习

  1. 读取交易记录
  2. 按照fundCode+securityId进行分组
  3. 对每个分组内的quantity进行汇总
  4. 输出结果

有两种写法:

写法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方式,其优点在于语法表现力更丰富,贴近原先开发习惯。

问题是:

  1. 因为sql语句是字符串,如有编写无法在编译时给出提示,只有在运行时才能知道异常。
  2. Spark支持的SQL语法不全。

小结

我们一共介绍了RDD和Dataframe两大类开发方式,各有两种开发方法:

  1. RDD编程

    • 以对象方式传递逻辑,操作最傻瓜,代码较长,可读性差。
    • 以lambda表达式传递逻辑,需要有一定的理解记忆,代码简洁,推荐使用。
  2. Dataframe编程
    • api方式编码,相比于RDD的api更为简洁,但由于进行了封装,功能会薄弱一些。
    • 调用sql语句,但是由于sql语句是字符串,可读性和可调试性较差,胜在表达能力强,并可以直接从现有系统迁移,对于存量系统迁移,推荐使用。

Spark菜鸟学习营Day3 RDD编程进阶的更多相关文章

  1. Spark菜鸟学习营Day1 从Java到RDD编程

    Spark菜鸟学习营Day1 从Java到RDD编程 菜鸟训练营主要的目标是帮助大家从零开始,初步掌握Spark程序的开发. Spark的编程模型是一步一步发展过来的,今天主要带大家走一下这段路,让我 ...

  2. Spark菜鸟学习营Day2 分布式系统需求分析

    Spark菜鸟学习营Day2 分布式系统需求分析 本分析主要针对从原有代码向Spark的迁移.要注意的是Spark和传统开发有着截然不同的思考思路,所以我们需要首先对原有代码进行需求分析,形成改造思路 ...

  3. Spark菜鸟学习营Day5 分布式程序开发

    Spark菜鸟学习营Day5 分布式程序开发 这一章会和我们前面进行的需求分析进行呼应,完成程序的开发. 开发步骤 分布式系统开发是一个复杂的过程,对于复杂过程,我们需要分解为简单步骤的组合. 针对每 ...

  4. Spark菜鸟学习营Day4 单元测试程序的编写

    Spark菜鸟学习营Day4 单元测试程序的编写 Spark相比于传统代码是比较难以调试的,单元测试的编写是非常必要的. Step0:需求分析 在测试案例编写前,需完成需求分析工作,明确程序所有的输入 ...

  5. Spark菜鸟学习营Day6 分布式代码运行调试

    Spark菜鸟学习营Day6 分布式代码运行调试 作为代码调试,一般会分成两个部分 语法调试,也就是确定能够运行 结果调试,也就是确定程序逻辑的正确 其实这个都离不开运行,所以我们说一下如何让开发的S ...

  6. 【Spark 深入学习 07】RDD编程之旅基础篇03-键值对RDD

    --------------------- 本节内容: · 键值对RDD出现背景 · 键值对RDD转化操作实例 · 键值对RDD行动操作实例 · 键值对RDD数据分区 · 参考资料 --------- ...

  7. 【spark 深入学习 05】RDD编程之旅基础篇-01

    ---------------- 本节内容 1.RDD的工作流程 2.WordCount解说  · shell版本WordCount  · java版本WordCount -------------- ...

  8. 【spark 深入学习 06】RDD编程之旅基础篇02-Spaek shell

    --------------------- 本节内容: · Spark转换 RDD操作实例 · Spark行动 RDD操作实例 · 参考资料 --------------------- 关于学习编程方 ...

  9. Learning Spark中文版--第三章--RDD编程(1)

       本章介绍了Spark用于数据处理的核心抽象概念,具有弹性的分布式数据集(RDD).一个RDD仅仅是一个分布式的元素集合.在Spark中,所有工作都表示为创建新的RDDs.转换现有的RDD,或者调 ...

随机推荐

  1. 【开源项目13】Volley框架 以及 设置request超时时间

    Volley提供了优美的框架,使android程序网络访问更容易.更快. Volley抽象实现了底层的HTTP Client库,我们不需关注HTTP Client细节,专注于写出更加漂亮.干净的RES ...

  2. JAVA中的deflate压缩实现

    在文件的传输过程中,为了使大文件能够更加方便快速的传输,一般采用压缩的办法来对文件压缩后再传输,JAVA中的java.util.zip包中的Deflater和Inflater类为使用者提供了DEFLA ...

  3. Python15-day1课后作业

    功能:编写一个用户登录接口 要求:1)根据提示输入用户名.密码信息 2)输入的用户.密码正确则显示欢迎信息 3)连续三次输入错误则锁定账号 #coding=utf-8import sys,os,get ...

  4. 【CSS3】---嵌入字体@font-face

    @font-face能够加载服务器端的字体文件,让浏览器端可以显示用户电脑里没有安装的字体. 语法: @font-face { font-family : 字体名称; src : 字体文件在服务器上的 ...

  5. 【转载】TalkingData首席金融行业专家鲍忠铁:18亿数据解读移动互联网

    http://www.36dsj.com/archives/33417 鲍忠铁:大家下午好! 今天我会讲三个议题,一是用18亿数据解读现在移动互联网的生态圈.二是看看数据有什么样的应用.三是大数据的隐 ...

  6. (js有关图片加载问题)dom加载完和onload事件

    引用旺旺的话...哈哈哈DOMContentLoaded事件表示页面的DOM结构绘制完成了,这时候外部资源(带src属性的)还没有加载完.而onload事件是等外部资源都加载完了就触发的.$.read ...

  7. 路由器之VPN应用与配置指南

    应用背景 近日,公司需要在外人员通过直接访问连接到公司内网,实现办公等一系列操作,这个时候就需要通过配置路由器VPN实现该需求了. 无线企业路由器可以帮助中小型企业搭建高性价比.稳定的企业办公网络,灵 ...

  8. dataAdapter与dataSet和dataTable的填充

    对于dataAdapter与dataSet和dataTable的填充,可以分为1对1,1对n,n对n,3种情况. 以SqlDataAdapter为例. //(1)1对1 SqlDataAdapter ...

  9. C#DateTime的用法

    本文较详细地介绍了C#的DateTime对象的使用方法.DateTime.Now.ToShortTimeString() DateTime dt = DateTime.Now; dt.ToString ...

  10. 【SNMP】SNMP概述

    SNMP概述 SNMP(Simple Network Management Protocol,简单网络管理协议)是目前UDP/IP网络中应用最为广泛的网络管理协议,它提供了一个管理框架来监控和维护互联 ...