zoukankan      html  css  js  c++  java
  • Spark菜鸟学习营Day3 RDD编程进阶

    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
     " +
                    "           from p_table 
    " +
                    "           group by fundcode,securityid");
    

    直接使用sql语句来开发,相比于api方式,其优点在于语法表现力更丰富,贴近原先开发习惯。 问题是:

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

    小结

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

    1. RDD编程
      • 以对象方式传递逻辑,操作最傻瓜,代码较长,可读性差。
      • 以lambda表达式传递逻辑,需要有一定的理解记忆,代码简洁,推荐使用。
    2. Dataframe编程
      • api方式编码,相比于RDD的api更为简洁,但由于进行了封装,功能会薄弱一些。
      • 调用sql语句,但是由于sql语句是字符串,可读性和可调试性较差,胜在表达能力强,并可以直接从现有系统迁移,对于存量系统迁移,推荐使用。
  • 相关阅读:
    记一次centos7.2下用crontab执行定时任务的过程(初级)
    海外手机号码正则匹配
    装了wamp之后,80端口被占用解决办法
    newtonsoft动态修改JObject
    .net正则提取手机号码,并替换带有手机号码的a标签
    .vs目录有什么用?
    centos7安装nginx-1.13.6 新手入门,图文解析
    centos7安装kafka_2.11-1.0.0 新手入门
    centos7安装apache 新手入门 图文教程
    面向对象——案例练习(4)判断点是否在圆的内部
  • 原文地址:https://www.cnblogs.com/dt-zhw/p/5837284.html
Copyright © 2011-2022 走看看