Scala 学习 进击大数据Spark生态圈

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: Scala 学习 进击大数据Spark生态圈

第一章:简单讲解了一下Scala的优劣势

第二章:

   val:常量(值)  会自动生成get方法

   var: 变量        自动生成get/set方法

   lazy属性是遇到Action操作才会执行

   优点:大数据需要提前加载的时候不会占用整个系统很多资源

   缺点:不判断程序或加载数据的对错,只有在Action运行时才发现

   IDEA开发工具的使用:

       1、windows下载maven,配置环境变量

       2、plugins 可以手动添加Scala包,也可以idea下载

第三章:def 函数名

(可以无参数,也可以有参数): 返回类型(Unit无返回类型) {

   //函数体

   如果有返回类型,最后一行被当做是返回类型,不需要return

   }

   如果函数名(无参数) 调用时可以直接函数名

   默认参数:可以写一个默认参数函数名(a:Int = 3),如果没有赋予其它参数,默认a=3

   命名参数:参数名对应好了,顺序可以错乱

   循环:

1 to 10 (1,2,3,4,5,6,7,8,9,10) 1.to(10)
    1 until 10 (1,2,3,4,5,6,7,8,9) 1.until(10)
    Range(1,10) (1,2,3,4,5,6,7,8,9)
    for(变量 <- 要遍历的数据) 
    for(变量 <- 要遍历的数据   条件)
    x.foreach()等价于for循环
    while(循环条件)

根据输入的数据不定参数进行计算

   例:

println(num(1,2,3))
        println(num(1,2,3,4))
        def num(no:Int*) = {
          var result = 0
          for(i <- no){
            result += i
          }
          result
        }

第四章

封装:属性、方法封装到类中(类是被抽象出来的)

属性:person  

private int id, String name, date birthday   geter/seter

       方法:eat sleep run

   继承:

       父类和子类之间的关系

           子类继承父类,并且还可以重写override

           子类继承父类,如果父类有的属性,子类可以不加var/val,父类的方法会执行

       重写:子类需要修改父类的方法、属性时需要进行重写 override xxx

       抽象类:类的一个或者多个方法、属性没有实现(只有定义)

               想要调用,必须实现所有的类、方法,否则不能被调用

        多态:父类的引用指向子类

Person person = new Person()
        User user = new User()
        val p = new User()  //父类接口,子类实现功能

          类的定义:

private 只在当前类中调用
        _ 占位符,使用占位符必须指定var的数据类型

     构造器:

       主构造器:

跟在类名后面的属性叫主构造器 class Person(val name:String, val age:Int)
        附属构造器:
            def this(name:String, age:Int, gender:String){
                this(name,age)   //附构造器第一句话必须调用主构造器或者其它附属构造器
                this.gender=gender
            }

   伴生类、伴生对象:

如果有一个class,还有一个和class同名的object, class是object的伴生类,object是class的伴生对象
        object类可以直接val p = Person()

   APPLY方法:

       在object的apply方法中new class

       类名() 调用的object.apply

       对象() 调用的class.apply

   case class:通常用在模式匹配中,调用时不用new,直接调用即可

   trait:需要多个继承的时候with链接

第五章:Array 定长数组,定义以后数组长度不能改变

   可变数组:scala.collection.mutable.ArrayBuffer   +增加数据,++需要加入Array

   不可变数组:scala.collection.immutable._

   List: Nil 是一个不可变的空集合List,是有序的可以重复的   :_* 可以将Seq转化为list

   Buffer:ListBuffer、ArrayBuffer 带Buffer都是可变的

   Set:数据是不能重复的

   Map:(key-value)键值对操作

第六章

   匹配模式:

变量 match{
            case x => xxx  
            case _ => xxx   //相当于java的 default
        }

   条件模式匹配:

变量 match{
            case x => xxx  
            case _ if(xxx) => xxx   //注意执行的先后顺序
            case _ => xxx   //相当于java的 default
        }

   数组匹配:

def NameScore(array: Array[String]): Unit ={
            array match{
              case Array("zhangsan") => println("zhangsan")
              case Array(x,y) => println("x,y")
              case Array("zhangsan", _*) => println("Hi:zhangsan other one")   // _* 无限匹配
              case _ => println("erveryone")
            }
        }
        NameScore(Array("zhangsan"))
        NameScore(Array("zhangsan","lisi", "wangwu"))
        NameScore(Array("zhangwu"))

   List匹配

def NameScroe(list: List[String]): Unit ={
        list match{
          case "zhangsan"::Nil => println("zhangsan")
          case x::y::Nil => println("x,y")
          case "zhangsan":: tail => println("Hi:zhangsan other one")
          case _ => println("erveryone")
        }
      }
        NameScroe(List("zhangsan","wangwu"))
        NameScroe(List("zhangsan","lisi", "wangwu"))
        NameScroe(List("zhangwu"))

   类型匹配:

def ObjType(obj: Any){
        obj match{
          case x:Int => println("Int")
          case x:String => println("String")
          case x:Map[_,_] => x.foreach(print)
          case _ => println("other")
        }
      }
      ObjType(1)
      ObjType("1")
      ObjType(Map("key"->"value"))

   异常处理:

try{
        //要执行的代码
    }catch{
        //可以代码执行错误后,要进行提示或其它信息写到这里
    }finally{
        //一定会执行,记得要把资源关闭
    }
    case class 对类进行模式匹配,必须要定义一个顶级的类

   Some&None  模式匹配:

val b = Map("PK" -> 18, "zhangsan" -> 12, "lisi" -> 20)
      def gredeTest(name:String): Unit ={
        val getGred = b.get(name)
        getGred match{
          case Some(getGred) => println("this some")
          case None => println("this None")
        }
      }
      gredeTest("PK")
      gredeTest("lisi")
      gredeTest("wangwu")

第七章:字符串高级操作:

多行:借助于s"$常量或$变量" 进行打印

val a = "Hello"
          val b = "World"
          val c = s"$a $b!"
          println(c)
            使用""""""进行多行打印 Shift + "" 按3次
          val a1 =
            """
              |Hello
              |Wolrd
              |!
            """.stripMargin
          println(a1)

   匿名函数:匿名函数没有函数名,可以赋值给变量或常量或匿名函数

val a = (x:Int) => x+1  a(10)  结果:11
        val add = (x:Int, y:Int) => x + y  add(2,3) 结果:5

   柯里化:将原来接收多个参数的函数变换成接收一个单一的参数

   高阶函数:

Map:Map(x => (x,1))  可以把数据进行Tuple(key-value)操作、柯里化
        filter:根据条件过滤数据
        faltten:将数据进行shuffle, 
            val l = List(List(1,2), List(3,4))
            l.flatten
            结果:List[Int] = List(1, 2, 3, 4)

       FlatMap:结合了flatten和map的特点

       reduce:数据进行计算,例如加法:reduce(_+_)

           reduceLeft、reduceRight 从左或右开始计算

       fold: 数据进行计算,可以再进行单独加一些数据,例如加法,累加后额外再加1:reduce(1)(_+_)

           foldLeft、foldRight 数据进行计算,例如加法:reduce(_+_)

       foreach:循环遍历与for循环类似

   偏函数:{}内的没有match的一组case语句可以进行模式匹配

//PartialFunction[String, String] 偏函数特征[输入参数,输出参数]
      def moshi:PartialFunction[String, String] = {
        case "wangwu" => "王五"
        case "lisi" => "李四"
        case _ => "None"
      }
      println(moshi("wangwu"))

第八章

   隐士转换:通过implicit进行隐士转换,最好把隐士转换都放到一个类里面,方便调用------------面试重点

implicit def manToSuperMan(man: Man):SuperMan = new SuperMan(man.name)
          val superMan = new SuperMan("lisi")
          superMan.fly()
        class Man(val name:String){
          def eat(): Unit ={
            println(s"$name  is eat.....")
          }
        }
        class SuperMan(val name:String){
          def fly(): Unit ={
            println(s"$name is fly ......")
          }
        }

   隐士参数:对参数增加implicit

def testParam(implicit name:String){
        println(name + "====================")
      }
      implicit val name = "zhangsan"
      testParam
     隐士类:对类增加implicit
     implicit class classTest(x:String){
        def add(a:Int) = a + x
      }
      println("12345".length)

第九章

   读取文件:Source.fromFIle(文件路径)(文件编码可以不写),getLines整行读取

   读取MySQL数据:classOf[com.mysql.jdbc.Driver]

   读取XML:this.getClass.getClassLoader.getResource("xml文件")

       \  某一层

       \\ 所有


相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
4月前
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
297 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
5月前
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
108 0
|
5月前
|
数据采集 数据可视化 大数据
大数据体系知识学习(三):数据清洗_箱线图的概念以及代码实现
这篇文章介绍了如何使用Python中的matplotlib和numpy库来创建箱线图,以检测和处理数据集中的异常值。
109 1
大数据体系知识学习(三):数据清洗_箱线图的概念以及代码实现
|
5月前
|
Java 大数据 数据库连接
大数据-163 Apache Kylin 全量增量Cube的构建 手动触发合并 JDBC 操作 Scala
大数据-163 Apache Kylin 全量增量Cube的构建 手动触发合并 JDBC 操作 Scala
81 2
大数据-163 Apache Kylin 全量增量Cube的构建 手动触发合并 JDBC 操作 Scala
|
4月前
|
SQL 机器学习/深度学习 分布式计算
Spark快速上手:揭秘大数据处理的高效秘密,让你轻松应对海量数据
【10月更文挑战第25天】本文全面介绍了大数据处理框架 Spark,涵盖其基本概念、安装配置、编程模型及实际应用。Spark 是一个高效的分布式计算平台,支持批处理、实时流处理、SQL 查询和机器学习等任务。通过详细的技术综述和示例代码,帮助读者快速掌握 Spark 的核心技能。
194 6
|
4月前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第27天】在大数据时代,数据湖技术凭借其灵活性和成本效益成为企业存储和分析大规模异构数据的首选。Hadoop和Spark作为数据湖技术的核心组件,通过HDFS存储数据和Spark进行高效计算,实现了数据处理的优化。本文探讨了Hadoop与Spark的最佳实践,包括数据存储、处理、安全和可视化等方面,展示了它们在实际应用中的协同效应。
252 2
|
4月前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第26天】本文详细探讨了Hadoop与Spark在大数据处理中的协同作用,通过具体案例展示了两者的最佳实践。Hadoop的HDFS和MapReduce负责数据存储和预处理,确保高可靠性和容错性;Spark则凭借其高性能和丰富的API,进行深度分析和机器学习,实现高效的批处理和实时处理。
228 1
|
4月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
4月前
|
分布式计算 大数据 OLAP
AnalyticDB与大数据生态集成:Spark & Flink
【10月更文挑战第25天】在大数据时代,实时数据处理和分析变得越来越重要。AnalyticDB(ADB)是阿里云推出的一款完全托管的实时数据仓库服务,支持PB级数据的实时分析。为了充分发挥AnalyticDB的潜力,将其与大数据处理工具如Apache Spark和Apache Flink集成是非常必要的。本文将从我个人的角度出发,分享如何将AnalyticDB与Spark和Flink集成,构建端到端的大数据处理流水线,实现数据的实时分析和处理。
108 1
|
5月前
|
存储 SQL 分布式计算
大数据学习
【10月更文挑战第15天】
137 1