针对各个元素的转化操作
map() 接收一个函数,把这个函数用于 RDD 中的每个元素,将函数的返回结果作为结果RDD 中对应元素的值
filter() 则接收一个函数,并将 RDD 中满足该函数的 元素放入新的 RDD 中返回
map() 的返回值类型不需要和输 入类型一样
对每个输入元素生成多个输出元素。 flatMap() 返回值序列的迭代器。输出的 RDD 倒不是由迭代器得到的是一个包含各个迭代器可访问的所有元素的 RDD。apache支持java吗flatMap() 的一个简 单用途是把输入的字符串切分为单词
JavaRDD<String> words = word.flatMap(x->Arrays.asList(x.split(",")).iterator() );
伪集合操作
RDD 本身不是严格意义上的集合,但它也支持许多数学上的集合操作
RDD 中最常缺失的集合属性是元素的唯一性,因为常常有重复的元素。RDD.distinct() 转化操作来生成一个只包含不同元素的新RDD。distinct() 操作的开销很大,因为它需要将所有数据通过网络进行混洗(shuf??e),以确保每个元素都只有一份
集合操作 union(other),返回一个包含两个 RDD 中所有元素的 RDD。Spark 的 union() 操作也会包含这些重复数据 (如有必要,我们可以通过 distinct() 实现相同的效果)。
Spark 还提供了 intersection(other) 方法,只返回两个 RDD 中都有的元素。intersection() 的性能却要差很多,网络混洗数据
subtract(other) 函数接收另一个 RDD 作为参数,返回 一个由只存在于第一个 RDD 中而不存在于第二个 RDD 中的所有元素组成的 RDD。需要数据混洗。
计算两个 RDD 的笛卡儿积,cartesian(other) 转化操作会返回 所有可能的 (a, b) 对。笛卡儿积在我们希望考虑所有可能的组合的相似度时比较有用(产品的预期兴 趣程度),开销巨大。
行动操作

基本 RDD 上最常见的行动操作 reduce()。接收一个函数作为参数,这个函数要操作两个 RDD 的元素类型的数据并返回一个同样类型的新元素
JavaPairRDD<String, Integer> results = counts.reduceByKey((x,y)->{ return x+y; });
fold() 和 reduce() 类似,接收一个与 reduce() 接收的函数签名相同的函数,再加上一个 “初始值”来作为每个分区第一次调用时的结果。使用你的函数对这个初始值进行多次计算不会改变结果
通过原地修改并返回两个参数中的前一个的值来节约在 fold() 中创 建对象的开销
fold() 和 reduce() 都要求函数的返回值类型需要和我们所操作的 RDD 中的元素类型相 同。在计算平均值时,需要记录遍历过程中的计数以及元素的数量,这就需要我们返回一 个二元组。对数据使用 map() 操作,来把元素转为该元素和 1 的二元组
//reduce求平均
JavaPairRDD<String,Integer> counts = words.mapToPair(s -> new Tuple2<String, Integer>(s,1));
JavaPairRDD<String, Integer> results = counts.reduceByKey((x,y)->{ return x+y; });
//fold求平均
Integer reduce = line.fold(0, (x,y) -> x+y);
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/sanxing/article-57960-3.html
假
中国没有不好