来自 Apache Spark 的官方文档:
http://spark.apache.org/docs/latest/rdd-programming-guide.html
map(func):返回一个新的分布式数据集,该数据集是通过函数func传递源的每个元素形成的。
filter(func) 返回一个新数据集,该数据集通过选择源中 func 返回 true 的那些元素而形成。
大胆地说,这是一个很大的区别吗?真的有区别吗?
它们用于不同的目的。如果我们查看 的(简化的)方法定义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)
实际上,这与最终用户使用 API 的方式不同。map意味着将记录作为输入并返回您应用了某些函数的记录。而filter意味着将记录作为输入并返回布尔值。Spark 内部将使用mapPartitions.