Apache Spark中的map vs filter

时间:2018-01-06 17:33:00

标签: apache-spark

来自Apache Spark的官方文档:

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

  

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

     

filter(func)返回一个新的数据集,选择func返回true的源元素。

用粗话来说,这是一个很大的区别吗?它真的有区别吗?

3 个答案:

答案 0 :(得分:3)

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

def map[U](func: (T) ⇒ U): Dataset[U]

期望给定类型为T的元素,您将生成类型为U的元素forall T,从而生成Dataset[U]。换句话说,是一种将T类型的元素转换为U类型的方法。

另一方面,filter

def filter(func: (T) ⇒ Boolean): Dataset[T]

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

map的具体示例可以是:

val someDataSet: DataSet[String] = ???
val transformedDataSet: DataSet[Int] = someDataSet.map(str => str.toInt)

对于过滤器:

val someDataSet: DataSet[String] = ???
val transformedDataSet: DataSet[String] = someDataSet.filter(str => str.length > 5)

答案 1 :(得分:3)

这与最终用户在使用API​​的方式上存在差异。 map用于记录输入并返回您已应用某些功能的记录。而filter意味着将记录作为输入并返回布尔值。内部Spark将使用mapPartitions执行。

答案 2 :(得分:0)

将整个RDD视为一个管道,在该管道中放置苹果,香蕉和桃子,然后在管道中有一个只允许通过苹果的过滤器[filter],所以只有一个苹果,然后您想要用一些糖将一个苹果变成一个糖果苹果[地图]

因此,您从苹果,香蕉和桃子开始,最终生产出糖果苹果。