# 傳遞函數到 Spark
Spark 的 API 很大程度上依靠在驅動程序里傳遞函數到集群上運行。這里有兩種推薦的方式:
- [匿名函數 (Anonymous function syntax)](http://docs.scala-lang.org/tutorials/tour/anonymous-function-syntax.html),可以在比較短的代碼中使用。
- 全局單例對象里的靜態方法。例如,你可以定義 `object MyFunctions` 然后傳遞 `MyFounctions.func1`,像下面這樣:
```scala
object MyFunctions {
def func1(s: String): String = { ... }
}
myRdd.map(MyFunctions.func1)
```
注意,它可能傳遞的是一個類實例里的一個方法引用(而不是一個單例對象),這里必須傳送包含方法的整個對象。例如:
```scala
class MyClass {
def func1(s: String): String = { ... }
def doStuff(rdd: RDD[String]): RDD[String] = { rdd.map(func1) }
}
```
這里,如果我們創建了一個 `new MyClass` 對象,并且調用它的 `doStuff`,`map` 里面引用了這個 `MyClass` 實例中的 `func1` 方法,所以這個對象必須傳送到集群上。類似寫成 `rdd.map(x => this.func1(x))`。
以類似的方式,訪問外部對象的字段將會引用整個對象:
```scala
class MyClass {
val field = "Hello"
def doStuff(rdd: RDD[String]): RDD[String] = { rdd.map(x => field + x) }
}
```
相當于寫成 `rdd.map(x => this.field + x)`,引用了整個 `this` 對象。為了避免這個問題,最簡單的方式是復制 `field` 到一個本地變量而不是從外部訪問它:
```scala
def doStuff(rdd: RDD[String]): RDD[String] = {
val field_ = this.field
rdd.map(x => field_ + x)
}
```
- Introduction
- 快速上手
- Spark Shell
- 獨立應用程序
- 開始翻滾吧!
- RDD編程基礎
- 基礎介紹
- 外部數據集
- RDD 操作
- 轉換Transformations
- map與flatMap解析
- 動作Actions
- RDD持久化
- RDD容錯機制
- 傳遞函數到 Spark
- 使用鍵值對
- RDD依賴關系與DAG
- 共享變量
- Spark Streaming
- 一個快速的例子
- 基本概念
- 關聯
- 初始化StreamingContext
- 離散流
- 輸入DStreams
- DStream中的轉換
- DStream的輸出操作
- 緩存或持久化
- Checkpointing
- 部署應用程序
- 監控應用程序
- 性能調優
- 減少批數據的執行時間
- 設置正確的批容量
- 內存調優
- 容錯語義
- Spark SQL
- 概述
- SparkSQLvsHiveSQL
- 數據源
- RDDs
- parquet文件
- JSON數據集
- Hive表
- 數據源例子
- join操作
- 聚合操作
- 性能調優
- 其他
- Spark SQL數據類型
- 其它SQL接口
- 編寫語言集成(Language-Integrated)的相關查詢
- GraphX編程指南
- 開始
- 屬性圖
- 圖操作符
- Pregel API
- 圖構造者
- 部署
- 頂點和邊RDDs
- 圖算法
- 例子
- 更多文檔
- 提交應用程序
- 獨立運行Spark
- 在yarn上運行Spark
- Spark配置
- RDD 持久化