spark scala2.x中使用 scala 实现:订单中 门店下的用户数统计,并且计算平均消费金额,交易笔数

在内存和CPU使用方面进一步优化Spark引擎性能(钨丝计划)。支持SQL 2003标准 ,支持子查询,对常用的SQL操作和DataFrame,性能有2-10倍的提升。

  • +=表示在ArrayBuffer尾部添加元素,尾部添加多个元素时用括号包起来
  • ++=表示追加任何集合

Scala 列表类似于数组,它们所有元素的类型都相同,但是它们也有所不同:列表是不可变的,值一旦被定义了就不能改变,其次列表 具有递归的结构(也就是链接表结构)而数组不是。。
列表的元素类型 T 可以写成 List[T]。

Nil 也可以表示为一个空列表。

集合中使用下划线是最常用的形式,下划线代表了集合中的“某(this)”一个元素。nums.filter(_>0)等价于nums.filter(x=>x>0),其中x=>x>0是匿名函数,且参数在函数体中只出现一次,可以简写成_>0

与列表一样,元组也是不可变的,但与列表不同,元组可以包含不同类型的元素。而列表应该是List[Int]或List[String]的样子,元组可以同时拥有Int和String。元组很有用,比方说,如果你需要在方法里返回多个对象。Java里你将经常创建一个JavaBean样子的类去装多个返回值,Scala里你可以简单地返回一个元组。而且这么做的确简单:实例化一个装有一些对象的新元组,只要把这些对象放在括号里,并用逗号分隔即可。一旦你已经实例化了一个元组,你可以用点号,下划线和一个基于1的元素索引访问它。

你或许想知道为什么你不能像访问List里的元素那样访问元组的,就像pair(0)。那是因为List的apply方法始终返回同样的类型,但是元组里的或许类型不同。这些_N数字是基于1的,而不是基于0的,因为对于拥有静态类型元组的其他语言,如Haskell和ML,从1开始是传统的设定。

Scala映射(Map)是一组键/值对的对象。 任何值都可以根据键来进行检索。键在映射中是唯一的,但值不一定是唯一的。映射也称为哈希表。映射有两种,不可变的和可变的。可变对象和不可变对象之间的区别在于,当对象不可变时,对象本身无法更改。

默认情况下,Scala使用不可变映射(Map)。如果要使用可变集合(Set),则必须明确导入scala.collection.mutable.Map类。如果想同时使用可变的和不可变映射(Map),那么可以继续引用不可变映射(Map),但是可以将mutable集合引用mutable.Map。

scala提供了许多用于添加和移除元素的操作符,总结如下。

  • 向后(:+),向前(+:)追加元素到有序集合
  • 添加(+)元素到无序集合
  • 用++和–来批量添加和移除元素
  • 对于列表,优先使用::和:::

2.10 将函数映射到集合

任何一种函数式语言中,都有map函数与faltMap这两个函数

  • map函数的用法,顾名思义,将一个函数传入map中,然后利用传入的这个函数,将集合中的每个元素处理,并将处理后的结果返回。
  • 而flatMap与map唯一不一样的地方就是传入的函数在处理完后返回值必须是List,其实这也不难理解,既然是flatMap,那除了map以外必然还有flat的操作,所以需要返回值是List才能执行flat这一步。

模式匹配包括一系列备选项,每个替代项以关键字大小写为单位。每个替代方案包括一个模式和一个或多个表达式,如果模式匹配,将会进行评估计算。箭头符号=>将模式与表达式分离。

以下实例演示了使用正则表达式查找单词 Scala

  • 如果需要查看所有的匹配项可以使用 findAllIn 方法。

你可以使用 mkString( ) 方法来连接正则表达式匹配结果的字符串,并可以使用管道(|)来设置不同的模式

  • 构造器的参数直接放到类名之后。
  • Scala对每个字段都提供了getter和setter方法,在生成面向JVM的类时,每个字段生成一个私有字段以及对应的getter和setter方法,这两个方法是public,在需要时可以重新定义getter和setter。(对于私有字段生成的getter和setter方法也是私有的。)
  • 调用无参方法,可以省略圆括号。建议对于修改对象值的方法使用圆括号,只是读值的方法不使用圆括号。
  • 一个类没有显示定义构造器,则自动拥有一个无参构造器
  • 辅助构造器的名称是this

Scala比Java更面向对象,因为在Scala中不能拥有静态成员,Scala它使用单例对象。单例是一种只能有一个实例的对象。使用object关键字对象而不是class关键字创建单例。由于无法实例化单例对象,因此无法将参数传递给主构造函数。
object下的成员都是静态的,若有同名的class,这其作为它的伴生类。在object中一般可以为伴生类做一些初始化等操作

在Java或C++中,通常会用到既有实例方法也有静态方法的类,在Scala中将静态成员分离出来,形成与类同名的伴生对象(companion object)。类和它的伴生对象必须定义在同一个源文件中。类被称为是这个单例对象的伴生类(companion class)。

例子如下,直接将伴生类和伴生对象定义在同一源文件中即可。

在spark-shell模式下,要同时定义类和对象,必须用粘贴模式。键入:paste,然后键入或粘贴类和对象的定义,最后一Ctrl+D退出粘贴模式。

注意:类和他的伴生对象可以相互访问私有成员,他们必须定义在同一个源文件中。

不与伴生类共享名称的单例对象称为独立对象。它可以用在很多地方,例如作为相关功能方法的工具类,或者定义Scala应用的入口点。

比如下面程序中的Demo就是独立对象,其中包含了main方法,类似与Java的主类中的main方法,是应用程序的入口。

将上述程序保存在源文件:Demo.scala 中,使用Scala命令编译和执行此程序。

  • Account类的构造器是私有的,所以不能直接通过构造器来定义Account类的对象
  • Account类的伴生对象可以访问Account类的私有构造器, 通过apply方法定义了一个Account类的对象

每个Scala程序默认从下面代码开始:

1、重写一个非抽象方法必须使用override修饰符。
2、只有主构造函数才可以往基类的构造函数里写参数。
3、在子类中重写超类的抽象方法时,你不需要使用override关键字。

以前写过一篇spark1.6.x编写永久的自定义函数,今天补上写spark2.x永久自定义函数的步骤:

1、使用scala语言编写自定义函数,spark2.x已经不在支持使用hive的方式加载函数


参考资料

 

随机推荐