以下内容来自 Spark 官方文档 Actions 小节, 更多内容可查看官方文档. 如有不当之处, 欢迎指正.
行动 | 涵义 |
---|---|
reduce(func) | 使用传入的函数参数 func 对数据集中的元素进行汇聚操作 (两两合并). 该函数应该具有可交换与可结合的性质, 以便于能够正确地进行并行计算. |
collect() | 在 driver program 上将数据集中的元素作为一个数组返回. 这在执行一个 filter 或是其他返回一个足够小的子数据集操作后十分有用. |
count() | 返回数据集中的元素个数 |
first() | 返回数据集中的第一个元素 (与 take(1) 类似) |
take(n) | 返回数据集中的前 n 个元素 |
takeSample(withReplacement, num, [seed]) | 以数组的形式返回数据集中随机采样的 num 个元素. |
takeOrdered(n, [ordering]) | 以其自然序或使用自定义的比较器返回 RDD 的前 n 元素 |
saveAsTextFile(path) | 将数据集中的元素写入到指定目录下的一个或多个文本文件中, 该目录可以存在于本地文件系统, HDFS 或其他 Hadoop 支持的文件系统. Spark 将会对每个元素调用 toString 将其转换为文件的一行文本. |
saveAsSequenceFile(path)(Java and Scala) | 对于本地文件系统, HDFS 或其他任何 Hadoop 支持的文件系统上的一个指定路径, 将数据集中的元素写为一个 Hadoop SequenceFile. 仅适用于实现了 Hadoop Writable 接口的 kay-value pair 的 RDD. 在 Scala 中, 同样适用于能够被隐式转换成 Writable 的类型上 (Spark 包含了对于 Int, Double, String 等基本类型的转换). |
saveAsObjectFile(path)(Java and Scala) | 使用 Java 序列化将数据集中的元素简单写为格式化数据, 可以通过 SparkContext.objectFile() 进行加载. |
countByKey() | 仅适用于 (K, V) 类型的 RDD. 返回每个 key 的 value 数的一个 hashmap (K, int) pair. |
foreach(func) | 对数据集中的每个元素执行函数 func. 这通常用于更新一个 Accumulator 或与外部存储系统交互时的副作用. 注意: 修改 foreach() 外的非 Accumulator 变量可能导致未定义的行为. 更多细节请查看 Understanding closures. |
可以看出 action 的所有操作都是针对数据集中 “元素” (element) 级别的动作, action 的主要内容是 存储 和 计算. 引用 《Learning Spark》 里的说法:
Actions are operations that return a result to the driver program or write it to storage, and kick off a computation, such as count() and first().
再进一步细分的话大概有:
获取元素
collect(), first(), take(n), takeSample(withReplacement, num, [seed]), takeOrdered(n, [ordering])计数元素
count(), countByKey()迭代元素
reduce(func), foreach(func)保存元素
saveAsTextFile(path), saveAsSequenceFile(path), saveAsObjectFile(path)
最后如果你对 transformation 和 action 仍有疑惑的话,书里也教了一个识别的好方法,观察函数的返回类型:如果返回的是 RDD 类型,那么这是 transformation; 如果返回的是其他数据类型,那么这是 action.
If you are ever confused whether a given function is a transformation or an action, you can look at its return type: transformations return RDDs, whereas actions return some other data type.