Apache Spark 中的映射与过滤器

Man*_*oid 2 apache-spark

来自 Apache Spark 的官方文档:

http://spark.apache.org/docs/latest/rdd-programming-guide.html

map(func):返回一个新的分布式数据集,该数据集是通过函数func传递源的每个元素形成的。

filter(func) 返回一个新数据集,该数据集通过选择源中 func 返回 true 的那些元素而形成。

大胆地说,这是一个很大的区别吗?真的有区别吗?

Yuv*_*kov 5

它们用于不同的目的。如果我们查看 的(简化的)方法定义map

def map[U](func: (T) ? U): Dataset[U]
Run Code Online (Sandbox Code Playgroud)

期望给定一个 type 的元素T,你产生一个 type 的元素Uforall T,结果是 a Dataset[U]。换句话说,一种T将 type元素转换为 type 的方法U

另一方面,filter

def filter(func: (T) ? Boolean): Dataset[T]
Run Code Online (Sandbox Code Playgroud)

期望给定一个 type 元素T,您提供一个Boolean值,该值表示该给定元素是否应该在结果中返回Dataset[T](通常称为Predicate)。

一个具体的例子map可以是:

val someDataSet: DataSet[String] = ???
val transformedDataSet: DataSet[Int] = someDataSet.map(str => str.toInt)
Run Code Online (Sandbox Code Playgroud)

对于过滤器:

val someDataSet: DataSet[String] = ???
val transformedDataSet: DataSet[String] = someDataSet.filter(str => str.length > 5)
Run Code Online (Sandbox Code Playgroud)


Sil*_*vio 5

实际上,这与最终用户使用 API 的方式不同。map意味着将记录作为输入并返回您应用了某些函数的记录。而filter意味着将记录作为输入并返回布尔值。Spark 内部将使用mapPartitions.