在内存和CPU使用方面进一步优化Spark引擎性能(钨丝计划)。支持SQL 2003标准 ,支持子查询,对常用的SQL操作和DataFrame,性能有2-10倍的提升。
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提供了许多用于添加和移除元素的操作符,总结如下。
任何一种函数式语言中,都有map函数与faltMap这两个函数
模式匹配包括一系列备选项,每个替代项以关键字大小写为单位。每个替代方案包括一个模式和一个或多个表达式,如果模式匹配,将会进行评估计算。箭头符号=>将模式与表达式分离。
以下实例演示了使用正则表达式查找单词 Scala
你可以使用 mkString( ) 方法来连接正则表达式匹配结果的字符串,并可以使用管道(|)来设置不同的模式
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命令编译和执行此程序。
每个Scala程序默认从下面代码开始:
1、重写一个非抽象方法必须使用override修饰符。
2、只有主构造函数才可以往基类的构造函数里写参数。
3、在子类中重写超类的抽象方法时,你不需要使用override关键字。
以前写过一篇spark1.6.x编写永久的自定义函数,今天补上写spark2.x永久自定义函数的步骤:
1、使用scala语言编写自定义函数,spark2.x已经不在支持使用hive的方式加载函数