RDD的最常见的几个API以及scalascala 语法 pdf解释

如何学习Spark API? - 知乎30被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答96 条评论分享收藏感谢收起1添加评论分享收藏感谢收起写回答当前位置: &
6,884 次阅读 -
Scala是一门现代的多范式编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。Scala允许用户使用命令和函数范式编写代码。Scala运行在Java虚拟机之上,可以直接调用Java类库。对于新手来说,Scala相对比较复杂,其看起来灵活的语法并不容易掌握,但是对于熟悉Scala的用户来说,Scala是一把利器,它提供了许多独特的语言机制,可以以库的形式轻易无缝添加新的语言结构。近日,Spotify的软件工程师Neville Li发表了一篇题为《》的文章,他认为现在的编程语言种类非常多,每种语言都各有优缺点,并且它们的适用的场景也不同,比如Scala就非常适合用于数据处理和机器学习。
在大数据和机器学习领域,很多开发者都有Python/R/Matlab语言的背景,相比与Java或者C++,Scala的语法更容易掌握。从以往的经验来看,只要掌握基本的集合API以及lambda,一个没有经验的新员工就可以快速上手处理数据。像、和这样的类库都通过操作符重写模仿了一些流行工具的语法以及其它的一些语法糖,简单并且容易使用。另外,Scala的性能比传统的Python或者R语言更好。
由于Scala运行于Java平台(Java虚拟机),并兼容现有的Java程序,所以Scala可以和大数据相关的基于JVM的系统很好的集成,比如基于JVM类库的框架Scalding(Cascading)、(Scalding和Storm)、(Crunch)、(Java编写并有Scala的API),本身使用Scale开发的系统Spark、Kafka。另外,很多数据存储解决方案都支持JVM语言,比如、、和。
函数编程范式更适合用于Map/Reduce和大数据模型,它摒弃了数据与状态的计算模型,着眼于函数本身,而非执行的过程的数据和状态的处理。函数范式逻辑清晰、简单,非常适合用于处理基于不变数据的批量处理工作,这些工作基本都是通过map和reduce操作转换数据后,生成新的数据副本,然后再进行处理。而大多数的Scala数据框架都能够把Scala数据集合API和抽象数据类型相统一,比如Scalding中的与Spark中的都有相同的方法,包括map、flatMap、filter、reduce、fold和groupBy,这样使用Scala来处理就更为方便。开发者只需要学习标准集合就可以迅速上手其它工具包。另外,很多的类库都参考了范畴论中的一些设计,它们通过使用semigroup、monoid、group标识来保证分布式操作的正确性。
注:转载文章均来自于公开网络,仅供学习使用,不会用于任何商业用途,如果侵犯到原作者的权益,请您与我们联系删除或者授权事宜,联系邮箱:contact@dataunion.org。转载数盟网站文章请注明原文章作者,否则产生的任何版权纠纷与数盟无关。
相关文章!
不用想啦,马上 发表自已的想法.
做最棒的数据科学社区
扫描二维码,加微信公众号
联系我们:没有更多推荐了,
不良信息举报
举报内容:
Spark RDD常用的函数
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!没有更多推荐了,
不良信息举报
举报内容:
RDD的最常见的几个API以及scala语法解释
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Scala隐式转换详解
简单说,隐式转换就是:当Scala编译器进行类型匹配时,如果找不到合适的候选,那么隐式转化提供了另外一种途径来告诉编译器如何将当前的类型转换成预期类型。
隐式转换有四种常见的使用场景:
将某一类型转换成预期类型类型增强与扩展模拟新的语法类型类
隐式转换有新旧两种定义方法,旧的定义方法指是的&implict def&形式,这是Scala 2.10版本之前的写法,在Scala 2.10版本之后,Scala推出了&隐式类&用来替换旧的隐式转换语法,因为&隐式类&是一种更加安全的方式,对被转换的类型来说,它的作用域更加清晰可控。
接下来我们通过实例来了解这两种隐式转换的写法。前文提到,隐式转换最为基本的使用场景是:将某一类型转换成预期类型,所以我们下面的例子就以最这种最简单的场景来演示,它们都实现了:将一个String类型的变量隐式转换为Int类型:
&implict def&形式的隐式转换
package com.github.scala.myimplicit
* A demo about scala implicit type conversion.
* @author Laurence Geng
object ImplicitDefDemo {
object MyImplicitTypeConversion {
implicit def strToInt(str: String) = str.toInt
def main(args: Array[String]) {
//compile error!
//val max = math.max(&1&, 2);
import MyImplicitTypeConversion.strToInt
val max = math.max(&1&, 2);
println(max)
&隐式类&形式的隐式转换
package com.github.scala.myimplicit
* A demo about scala implicit type conversion.
* @author Laurence Geng
object ImplicitClassDemo {
implicit class MyImplicitTypeConversion(val str: String){
def strToInt = str.toInt
def main(args: Array[String]) {
//compile error!
//val max = math.max(&1&, 2);
import com.github.scala.myimplicit.ImplicitDefDemo.MyImplicitTypeConversion._
val max = math.max(&1&, 2);
println(max)
隐式类有如下几个限制:
They must be defined inside of another trait/class/object.
They may only take one non-implicit argument in their constructor.
There may not be any method, member or object in scope with the same name as the implicit class.
Note: This means an implicit class cannot be a case class.
隐式类与旧的隐式转换的语法(implicit def)是有细微的不同的,隐式类的运作方式是:隐式类的主构造函数只能有一个参数(有两个以上并不会报错,但是这个隐式类永远不会被编译器作为隐式类在隐式转化中使用),且这个参数的类型就是将要被转换的目标类型。从语义上这很自然:这个隐式转换类将包裹目标类型,隐式类的所有方法都会自动&附加&到目标类型上。
转换成预期类型
对于这种使用场景实际上并不多见,实际意义也没有那么大。前文的代码就是这样这一场景的一个示例。
类型增强与扩展
真正让隐式转换大放异彩的是&类型增强&。这方面的示例是非常多的。
案例一:ArrayOps对Array的类型增强
一个典型案例是:Scala对Array对象进行的隐式转换。我们知道,Scala通过Predef声明了针对Array类型的两个隐式转换:一个是到ArrayOps的隐式转化,另一个是到WrappedArray的隐式转换。以前者为例,它为Array对象&添加&了大量的操作,这是通过隐式转换来&通明&的对一个类进行增强的典型案例!以下是Scala API文档中对这一技术细节的说明:
Two implicit conversions exist in scala.Predef that are frequently applied to arrays: a conversion to scala.collection.mutable.ArrayOps (shown on line 4 of the example above) and a conversion to scala.collection.mutable.WrappedArray (a subtype of scala.collection.Seq). Both types make available many of the standard operations found in the Scala collections API. The conversion to ArrayOps is temporary, as all operations defined on ArrayOps return an Array, while the conversion to WrappedArray is permanent as all operations return a WrappedArray.
案例二:Spark中PairRDDFunctions对RDD的类型增强
如果你看一下Spark中的RDD以及它的子类是没有groupByKey, reduceByKey以及join这一类基于key-value元组的操作的,但是在你使用RDD时,这些操作是实实在在存在的,Spark正是通过隐式转换将一个RDD转换成了PairRDDFunctions, 这个动作是这样发生的:
首先在RDD的伴随对象中声明了从RDD到PairRDDFunctions的隐式转换:
然后在SparkContext中import了RDD的所有东西,使隐式转换生效。vcD4NCjxoMiBpZD0="模拟新的语法">模拟新的语法
这也是非常酷的一种应用场景。一个典型的应用场景就是Map中用于创建key-value元组的-&符号,它就是一个隐式转换的产物。-&不是 scala 本身的语法,而是类型 ArrowAssoc 的一个方法。这个类型定义在包 Scala.Predef 对象中。 Scala.Predef 自动引入到当前作用域,在这个对象中,同时定义了一个从类型 Any 到 ArrowAssoc 的隐含转换。因此当使用 1 -& &One&时,编译器自动插入从 1 转换到 ArrowAsso c转换。
类型类是一种非常灵活的设计模式,可以把类型的定义和行为进行分离,让扩展类行为变得非常方便。或者说如果我们想创建跨越类型的功能(即功能实现独立于类型去演变),那么这样的&功能&不是适合也不应该在主类型的层次结构上进行演变的,这时是使用类型类的绝佳场所。因为类型类是一个比较独立的语法,虽然它的实现需要使用到类型类,但是在本文中为了不止于失去焦点,我们不打算在这里详细介绍,而在接下来的一篇文章中进行专门的介绍。
隐式解析的搜索范围
这一部分的规则有些复杂,根据《Scala In Depth》所描述的,顶层的搜索逻辑是:
在当前作用域下查找。这种情形又分两种情况,一个是在当前作用域显示声明的implicit元素,另一个通过import导入的implicit元素。如果第一种方式没有找到,则编译器会继续在隐式参数类型的隐式作用域里查找。
真正复杂的地方是什么叫一个类型的隐式作用域?一个类型的隐式作用域指的是&与该类型相关联的类型&的所有的伴生对象。
OK,那什么叫作&与一个类型相关联的类型&? 定义如下:
假如T是这样定义的:T with A with B with C,那么A, B, C的伴生对象都是T的搜索区域。如果T是类型参数,那么参数类型和基础类型都是T的搜索部分。比如对于类型List[Foo],List和Foo都是搜索区域如果T是一个单例类型p.T,那么p和T都是搜索区域如果T是类型注入p#T,那么p和T都是搜索区域。
为什么把隐式参数单独拿出来放到最后讲是因为从用意上讲,隐式参数与我们前面讲述的隐式类型转化有很大的差异,虽然它涉及到了关键字implict,但是它做的是另外一件事情。隐含参数有点类似缺省参数,如果在调用方法时没有提供某个参数,编译器会在当前作用域查找是否有符合条件的 implicit 对象可以作为参数传入,不同于缺省参数,隐式参数的值可以在方法调用的前的上下文中指定,这是隐式参数更加灵活的地方。
object ImplicitParamDemo {
object Greeter{
def greet(name:String)(implicit prompt: String) {
println(&Welcome, & + name + &. The System is ready.&)
println(prompt)
def main(args: Array[String]) {
implicit val prompt = &&&
Greeter.greet(&admin&)}

我要回帖

更多关于 spark scala 语法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信