scala语法在spark withScope上的应用
withSpout在spark中是用来做DAG可视化的,它在代码里的用法如下(以map为例,spark 2.0.0版本)
def map[U: ClassTag](f: T => U): RDD[U] = withScope {
val cleanF = sc.clean(f)
new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
}
因为对scala语法比较生疏,初次见面,一脸懵逼,这里的withScope是个什么用法?乍看一下有种java的implements Comparable的感觉。
其实,withScope是一个函数。
map()的函数体其实就是调用了一下withScope,将泛型什么的先去掉,代码简单来看就是下面这个样子。
def map(f): RDD = withScope(func)
因为函数体只有简单的一句,所以省略了大括号 "{ }"。
map函数补上大括号可以是这个样子。
def map[U: ClassTag](f: T => U): RDD[U] = {
withScope {
val cleanF = sc.clean(f)
new MapPartitionsRDD[U, T](this, (context, pid, iter) => iter.map(cleanF))
}
}
函数只有单一参数,调用时,有时小括号和花括号是可以互换的 比如
rdd.map(x => x._1) //小括号
rdd.map{x => x._1} //花括号
这里,map()的参数是一个匿名函数,一句简短代码即可搞定。但是,当函数用一句搞不定时,就需要使用"{}"来界定代码块了。其实,于小括号和花括号之间来回切换的例子,在写spark程序时,经常遇到。
比如:
rdd.map(x => x._1).filter {
... //一些用一句代码不易搞定的复杂过滤逻辑
}
回到withScope,它就是一个只有单一参数的函数,而这个单一参数本身也是个函数。
private[spark] def withScope[U](body: => U): U = RDDOperationScope.withScope[U](sc)(body)
withScope的参数名是body,其类型是 => U。这表示body是一个函数,这个函数没有参数(=>左边没东西),而返回类型任意(=>右边是个泛型U)。
withScope的形式跟map类似。
柯里化函数
我们看到上文中的withScope()又调用了RDDOperationScope中定义的withScope,而且调用方式有些奇怪。有两个参数sc和body,而且用了两个括号。
再去看RDDOperationScope中withScope的定义,参数中也用了两个括号。第一个括号定义了sc和allowNesting参数,第二个括号定义了body参数。
这种形式在scala中叫做柯里化(currying)。
rivate[spark] def withScope[T](
sc: SparkContext,
allowNesting: Boolean = false)(body: => T): T = {
...
}
柯里化是将原先一次性接受的参数,改成了链式接受的形式。这里引用《快学scala》中的例子说明。
def mul(x: Int)(y: Int) = x * y //定义柯里化函数
mul(6)(7) //调用柯里化函数
严格来讲,首先调用mul(6),返回的结果是函数(y: Int) => 6 * y (x被替换成了6)。而这个函数又被应用到了7,最终得到42。
柯里化的本质是什么呢?
其实,上面的mul()是如下形式的简写。mul()本质上是定义了一个只有参数x的函数,其返回结果是另一个函数。
def mul(x: Int) = (y: Int) => x * y
scala语法在spark withScope上的应用的更多相关文章
- 解惑:在Ubuntu18.04.2的idea上运行Scala支持的spark程序遇到的问题
解惑:在Ubuntu18.04.2的idea上运行Scala支持的spark程序遇到的问题 一.前言 最近在做一点小的实验,用到了Scala,spark这些东西,于是在Linux平台上来完成,结果一个 ...
- 利用Scala语言开发Spark应用程序
Spark内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情.如果你对Scala语言还不太熟悉,可 以阅读网络教程A Scala Tutorial for Ja ...
- Java和Scala语法比较
类型推断 挑逗指数: 四星 我们知道,Scala一向以强大的类型推断闻名于世.很多时候,我们无须关心Scala类型推断系统的存在,因为很多时候它推断的结果跟直觉是一致的. Java在2016 年也新增 ...
- sbt打包Scala写的Spark程序,打包正常,提交运行时提示找不到对应的类
sbt打包Scala写的Spark程序,打包正常,提交运行时提示找不到对应的类 详述 使用sbt对写的Spark程序打包,过程中没有问题 spark-submit提交jar包运行提示找不到对应的类 解 ...
- scala语法解析(解码指环)
看惯了JAVA的语法,再看scala的语法,有的晦涩难懂.正好遇到一个介绍scala语法的文章,就直接截图留念.省的再临时抱佛脚了.
- Spark记录-Scala语法基础
参考:http://docs.scala-lang.org/cheatsheets/index.html.http://docs.scala-lang.org/.http://www.scala-la ...
- Scala语法笔记
JAVA中,举例你S是一个字符串,那么s(i)就是该字符串的第i个字符(s.charAt(i)).Scala中使用apply的方法 JAVA与C++的?:操作符 等同于Scala的 if ( x &g ...
- scala语法
1:双重for循环(相当于j是i的内存循环):for (i <-0 to n; j <-10 to 20){ println(i);println(j)} 2:单层for循环:for (i ...
- Scala 语法基础
一 简介 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性.Scala 运行在Java虚拟机上,并兼容现有的Java程序.Scal ...
随机推荐
- yield return:使用.NET的状态机生成器
通过关键字词组yield return,.Net Framework(从2.0开始)会为我们生成一个状态机.状态机实际上就是一个可枚举的类型化集合 理解yield return的工作方式 关键字词组y ...
- Redis&MongoDB&Zookeeper&Kafka
目录 Redis MongoDB Zookeeper Kafka Redis 概念 Redis是NoSQL中比较常典型的一个非关系型数据库,在日常工作中也是最为常见的.Redis是一个由C语言编写的开 ...
- netBeans 修改新建php文件头部注释模板
用Netbeans(版本8.2)写php配置模板,模板配置好,可以省很多事,方便开发,而且,显得很专业. 新建php文件时: <?php /** * Encoding : UTF-8 * Cre ...
- C# 泛型类和泛型方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 基于MVC4+EasyUI的Web开发框架形成之旅(7)--权限控制
我在上一篇随笔<基于MVC4+EasyUI的Web开发框架形成之旅--框架总体界面介绍>中大概介绍了基于MVC的Web开发框架的权限控制总体思路.其中的权限控制就是分为“用户登录身份验证” ...
- 读DataSnap源代码(六)
具体分析一下DataSanp App与Rest, WebBroker App的不同,先看TDSHTTPService. **************************************** ...
- 1.初步认识TypeScript
简介:typescript是C#之父主导的一门语言,本质上是向Javascript语言添加了可选的静态类型和基于面向对象的诸多特性.相当于javascript的超集,其包含es6.由于是和C#之父创造 ...
- JDK官网下载教程
进入官网网址 https://www.oracle.com/index.html 登录成功后,即可进行下载! PS:新版谷歌浏览器可能会出现无法下载的问题,使用IE浏览器即可.
- HDFS管理工具HDFS Explorer
HDFS Explorer是一个在windows上管理HDFS系统的工具,支持上传.下载.重命.复制.移动和删除等. 一.下载地址 CSDN下载地址:http://download.csdn.net/ ...
- 【java】对象赋值给另一个对象
对基本数据类型的赋值很简单的.基本类型存储了实际的数值,而并非指向一个对象的引用,所以在赋值的时候,是直接将一个地方的内容复制到另一个地方.对于a=b,修改b后并不会影响到a,这正是我们大多数情况下所 ...