From ceaf2b87b343abdbe756e675fbbfddfe09add4cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com> Date: Wed, 15 May 2019 17:57:21 +0800 Subject: [PATCH] =?UTF-8?q?RDD=E5=B8=B8=E7=94=A8=E7=AE=97=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/spark/spark-core/README.md | 27 -- code/spark/spark-core/pom.xml | 15 +- .../java/rdd/scala/TransformationTest.scala | 179 +++++++- notes/Spark-Transformation和Action.md | 420 ++++++++++++++++++ pictures/spark-aggregateByKey.png | Bin 0 -> 68895 bytes pictures/spark-getpartnum.png | Bin 0 -> 13397 bytes 6 files changed, 604 insertions(+), 37 deletions(-) delete mode 100644 code/spark/spark-core/README.md create mode 100644 pictures/spark-aggregateByKey.png create mode 100644 pictures/spark-getpartnum.png diff --git a/code/spark/spark-core/README.md b/code/spark/spark-core/README.md deleted file mode 100644 index e1cd8da..0000000 --- a/code/spark/spark-core/README.md +++ /dev/null @@ -1,27 +0,0 @@ -val list = List(3,6,9,10,12,21) -val listRDD = sc.parallelize(list) -val intsRDD = listRDD.map(_*10) -intsRDD.foreach(println) - -sc.parallelize(list).map(_*10).foreach(println) - - -sc.parallelize(list).filter(_>=10).foreach(println) - -val list = List(List(1, 2), List(3), List(), List(4, 5)) -sc.parallelize(list).flatMap(_.toList).map(_*10).foreach(println) - - -val list = List(1,2,3,4,5) -sc.parallelize(list).reduce((x,y) => x+y) -sc.parallelize(list).reduce(_+_) - - -val list = List(("hadoop", 2), ("spark", 3), ("spark", 5), ("storm", 6),("hadoop", 2)) -sc.parallelize(list).reduceByKey(_+_).foreach(println) - - - - val list = List(("hadoop", 2), ("spark", 3), ("spark", 5), ("storm", 6),("hadoop", 2)) -sc.parallelize(list).groupByKey().map(x=>(x._1,x._2.toList)).foreach(println) - diff --git a/code/spark/spark-core/pom.xml b/code/spark/spark-core/pom.xml index 139270c..c685072 100644 --- a/code/spark/spark-core/pom.xml +++ b/code/spark/spark-core/pom.xml @@ -9,7 +9,7 @@ 1.0 - 2.12.8 + 2.12 @@ -27,23 +27,20 @@ + org.apache.spark - spark-core_2.12 + spark-core_${scala.version} 2.4.0 - - org.scalatest - scalatest_2.12 - 3.0.1 - test - + junit junit 4.12 - + com.thoughtworks.paranamer paranamer diff --git a/code/spark/spark-core/src/main/java/rdd/scala/TransformationTest.scala b/code/spark/spark-core/src/main/java/rdd/scala/TransformationTest.scala index 8fcd2a1..1229dae 100644 --- a/code/spark/spark-core/src/main/java/rdd/scala/TransformationTest.scala +++ b/code/spark/spark-core/src/main/java/rdd/scala/TransformationTest.scala @@ -3,6 +3,8 @@ package rdd.scala import org.apache.spark.{SparkConf, SparkContext} import org.junit.{After, Test} +import scala.collection.mutable.ListBuffer + class TransformationTest { val conf: SparkConf = new SparkConf().setAppName("TransformationTest").setMaster("local[2]") @@ -11,10 +13,185 @@ class TransformationTest { @Test def map(): Unit = { - val list = List(3, 6, 9, 10, 12, 21) + val list = List(1, 2, 3) sc.parallelize(list).map(_ * 10).foreach(println) } + + @Test + def filter(): Unit = { + val list = List(3, 6, 9, 10, 12, 21) + sc.parallelize(list).filter(_ >= 10).foreach(println) + } + + + @Test + def flatMap(): Unit = { + val list = List(List(1, 2), List(3), List(), List(4, 5)) + sc.parallelize(list).flatMap(_.toList).map(_ * 10).foreach(println) + + val lines = List("spark flume spark", + "hadoop flume hive") + sc.parallelize(lines).flatMap(line => line.split(" ")). + map(word => (word, 1)).reduceByKey(_ + _).foreach(println) + + } + + + @Test + def mapPartitions(): Unit = { + val list = List(1, 2, 3, 4, 5, 6) + sc.parallelize(list, 3).mapPartitions(iterator => { + val buffer = new ListBuffer[Int] + while (iterator.hasNext) { + buffer.append(iterator.next() * 100) + } + buffer.toIterator + }).foreach(println) + } + + + @Test + def mapPartitionsWithIndex(): Unit = { + val list = List(1, 2, 3, 4, 5, 6) + sc.parallelize(list, 3).mapPartitionsWithIndex((index, iterator) => { + val buffer = new ListBuffer[String] + while (iterator.hasNext) { + buffer.append(index + "分区:" + iterator.next() * 100) + } + buffer.toIterator + }).foreach(println) + } + + + @Test + def sample(): Unit = { + val list = List(1, 2, 3, 4, 5, 6) + sc.parallelize(list).sample(withReplacement = false, 0.5).foreach(println) + } + + + @Test + def union(): Unit = { + val list1 = List(1, 2, 3) + val list2 = List(4, 5, 6) + sc.parallelize(list1).union(sc.parallelize(list2)).foreach(println) + } + + + @Test + def intersection(): Unit = { + val list1 = List(1, 2, 3, 4, 5) + val list2 = List(4, 5, 6) + sc.parallelize(list1).intersection(sc.parallelize(list2)).foreach(println) + } + + @Test + def distinct(): Unit = { + val list = List(1, 2, 2, 4, 4) + sc.parallelize(list).distinct().foreach(println) + } + + + @Test + def groupByKey(): Unit = { + val list = List(("hadoop", 2), ("spark", 3), ("spark", 5), ("storm", 6), ("hadoop", 2)) + sc.parallelize(list).groupByKey().map(x => (x._1, x._2.toList)).foreach(println) + } + + + @Test + def reduceByKey(): Unit = { + val list = List(("hadoop", 2), ("spark", 3), ("spark", 5), ("storm", 6), ("hadoop", 2)) + sc.parallelize(list).reduceByKey(_ + _).foreach(println) + } + + @Test + def aggregateByKey(): Unit = { + val list = List(("hadoop", 3), ("hadoop", 2), ("spark", 4), ("spark", 3), ("storm", 6), ("storm", 8)) + sc.parallelize(list, numSlices = 6).aggregateByKey(zeroValue = 0, numPartitions = 5)( + seqOp = math.max(_, _), + combOp = _ + _ + ).getNumPartitions + } + + + @Test + def sortBy(): Unit = { + val list01 = List((100, "hadoop"), (90, "spark"), (120, "storm")) + sc.parallelize(list01).sortByKey(ascending = false).foreach(println) + + val list02 = List(("hadoop", 100), ("spark", 90), ("storm", 120)) + sc.parallelize(list02).sortBy(x => x._2, ascending = false).foreach(println) + } + + + @Test + def join(): Unit = { + val list01 = List((1, "student01"), (2, "student02"), (3, "student03")) + val list02 = List((1, "teacher01"), (2, "teacher02"), (3, "teacher03")) + sc.parallelize(list01).join(sc.parallelize(list02)).foreach(println) + } + + + @Test + def cogroup(): Unit = { + val list01 = List((1, "a"), (1, "a"), (2, "b"), (3, "e")) + val list02 = List((1, "A"), (2, "B"), (3, "E")) + val list03 = List((1, "[ab]"), (2, "[bB]"), (3, "eE"), (3, "eE")) + sc.parallelize(list01).cogroup(sc.parallelize(list02), sc.parallelize(list03)).foreach(println) + } + + + @Test + def cartesian(): Unit = { + val list1 = List("A", "B", "C") + val list2 = List(1, 2, 3) + sc.parallelize(list1).cartesian(sc.parallelize(list2)).foreach(println) + } + + + @Test + def reduce(): Unit = { + val list = List(1, 2, 3, 4, 5) + sc.parallelize(list).reduce((x, y) => x + y) + sc.parallelize(list).reduce(_ + _) + } + + // 继承Ordering[T],实现自定义比较器 + class CustomOrdering extends Ordering[(Int, String)] { + override def compare(x: (Int, String), y: (Int, String)): Int + = if (x._2.length > y._2.length) 1 else -1 + } + + @Test + def takeOrdered(): Unit = { + val list = List((1, "hadoop"), (1, "storm"), (1, "azkaban"), (1, "hive")) + // 定义隐式默认值 + implicit val implicitOrdering = new CustomOrdering + sc.parallelize(list).takeOrdered(5) + } + + + @Test + def countByKey(): Unit = { + val list = List(("hadoop", 10), ("hadoop", 10), ("storm", 3), ("storm", 3), ("azkaban", 1)) + sc.parallelize(list).countByKey() + } + + @Test + def saveAsTextFile(): Unit = { + val list = List(("hadoop", 10), ("hadoop", 10), ("storm", 3), ("storm", 3), ("azkaban", 1)) + sc.parallelize(list).saveAsTextFile("/usr/file/temp") + } + + @Test + def saveAsSequenceFile(): Unit = { + val list = List(("hadoop", 10), ("hadoop", 10), ("storm", 3), ("storm", 3), ("azkaban", 1)) + sc.parallelize(list).saveAsSequenceFile("/usr/file/sequence") + } + + @After def destroy(): Unit = { sc.stop() diff --git a/notes/Spark-Transformation和Action.md b/notes/Spark-Transformation和Action.md index e69de29..5ea245a 100644 --- a/notes/Spark-Transformation和Action.md +++ b/notes/Spark-Transformation和Action.md @@ -0,0 +1,420 @@ +# Transformation 和 Action 常用算子 + + + +## 一、Transformation + +下表为spark官网给出的常用的Transformation算子: + +| Transformation算子 | Meaning(含义) | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| **map**(*func*) | 对原RDD中每个元素运用 *func* 函数,并生成新的RDD | +| **filter**(*func*) | 对原RDD中每个元素使用*func* 函数进行过滤,并生成新的RDD | +| **flatMap**(*func*) | 与 map 类似,但是每一个输入的 item 被映射成 0 个或多个输出的 items( *func* 返回类型需要为 Seq )。 | +| **mapPartitions**(*func*) | 与 map 类似,但函数单独在RDD的每个分区上运行, *func*函数的类型为 Iterator\ => Iterator\ ,其中T是RDD的类型,即RDD[T] | +| **mapPartitionsWithIndex**(*func*) | 与 mapPartitions 类似,但 *func* 类型为 (Int, Iterator\) => Iterator\ ,其中第一个参数为分区索引 | +| **sample**(*withReplacement*, *fraction*, *seed*) | 数据采样,有三个可选参数:设置是否放回(withReplacement)、采样的百分比(*fraction*)、随机数生成器的种子(seed); | +| **union**(*otherDataset*) | 合并两个RDD | +| **intersection**(*otherDataset*) | 求两个RDD的交集 | +| **distinct**([*numTasks*])) | 去重 | +| **groupByKey**([*numTasks*]) | 按照key值进行分区,即在一个 (K, V) 对的 dataset 上调用时,返回一个 (K, Iterable\)
**Note:** 如果分组是为了在每一个 key 上执行聚合操作(例如,sum 或 average),此时使用 `reduceByKey` 或 `aggregateByKey` 性能会更好
**Note:** 默认情况下,并行度取决于父 RDD 的分区数。可以传入 `numTasks` 参数进行修改。 | +| **reduceByKey**(*func*, [*numTasks*]) | 按照key值进行分组,并对分组后的数据执行归约操作。 | +| **aggregateByKey**(*zeroValue*,*numPartitions*)(*seqOp*, *combOp*, [*numTasks*]) | 当调用(K,V)对的数据集时,返回(K,U)对的数据集,其中使用给定的组合函数和zeroValue聚合每个键的值。与groupByKey类似,reduce任务的数量可通过第二个参数进行配置。 | +| **sortByKey**([*ascending*], [*numTasks*]) | 按照key进行排序,其中的key需要实现Ordered特质,即可比较 | +| **join**(*otherDataset*, [*numTasks*]) | 在一个 (K, V) 和 (K, W) 类型的 dataset 上调用时,返回一个 (K, (V, W)) pairs 的 dataset,等价于内连接操作。如果想要执行外连接,可以使用`leftOuterJoin`, `rightOuterJoin` 和 `fullOuterJoin` 等算子。 | +| **cogroup**(*otherDataset*, [*numTasks*]) | 在一个 (K, V) 对的 dataset 上调用时,返回一个 (K, (Iterable\, Iterable\)) tuples 的 dataset。 | +| **cartesian**(*otherDataset*) | 在一个 T 和 U 类型的 dataset 上调用时,返回一个 (T, U) 类型的 dataset(即笛卡尔积)。 | +| **coalesce**(*numPartitions*) | 将RDD中的分区数减少为numPartitions。 | +| **repartition**(*numPartitions*) | 随机重新调整RDD中的数据以创建更多或更少的分区,并在它们之间进行平衡。 | +| **repartitionAndSortWithinPartitions**(*partitioner*) | 根据给定的 partitioner(分区器)对 RDD 进行重新分区,并对分区中的数据按照 key 值进行排序。这比调用 `repartition` 然后再 sorting(排序)效率更高,因为它可以将排序过程推送到 shuffle 操作所在的机器。 | + +下面分别给出这些算子的基本使用实例: + +### 1.1 map + +```scala +val list = List(1,2,3) +sc.parallelize(list).map(_ * 10).foreach(println) + +// 输出结果: 10 20 30 (这里为了节省篇幅去掉了换行,后文亦同) +``` + +### 1.2 filter + +```scala +val list = List(3, 6, 9, 10, 12, 21) +sc.parallelize(list).filter(_ >= 10).foreach(println) + +// 输出: 10 12 21 +``` + +### 1.3 flatMap + +与 map 类似,但是每一个输入的 item 被映射成 0 个或多个输出的 items( *func* 返回类型需要为 Seq )。 + +```scala +val list = List(List(1, 2), List(3), List(), List(4, 5)) +sc.parallelize(list).flatMap(_.toList).map(_ * 10).foreach(println) + +// 输出结果 : 10 20 30 40 50 +``` + +flatMap 这个算子在日志分析中使用概率非常高,这里进行一下演示: + +拆分输入的每行数据为单个单词,并赋值为1,代表出现一次,之后按照单词分组并统计其出现总次数,代码如下: + +```scala +val lines = List("spark flume spark", + "hadoop flume hive") +sc.parallelize(lines).flatMap(line => line.split(" ")). +map(word=>(word,1)).reduceByKey(_+_).foreach(println) + +// 输出: +(spark,2) +(hive,1) +(hadoop,1) +(flume,2) +``` + +### 1.4 mapPartitions + +与 map 类似,但函数单独在RDD的每个分区上运行, *func*函数的类型为Iterator\ => Iterator\ (其中T是RDD的类型),即输入和输出都必须是可迭代类型。 + +```scala +val list = List(1, 2, 3, 4, 5, 6) +sc.parallelize(list, 3).mapPartitions(iterator => { + val buffer = new ListBuffer[Int] + while (iterator.hasNext) { + buffer.append(iterator.next() * 100) + } + buffer.toIterator +}).foreach(println) +//输出结果 +100 200 300 400 500 600 +``` + +### 1.5 mapPartitionsWithIndex + + 与 mapPartitions 类似,但 *func* 类型为 (Int, Iterator\) => Iterator\ ,其中第一个参数为分区索引。 + +```scala +val list = List(1, 2, 3, 4, 5, 6) +sc.parallelize(list, 3).mapPartitionsWithIndex((index, iterator) => { + val buffer = new ListBuffer[String] + while (iterator.hasNext) { + buffer.append(index + "分区:" + iterator.next() * 100) + } + buffer.toIterator +}).foreach(println) +//输出 +0分区:100 +0分区:200 +1分区:300 +1分区:400 +2分区:500 +2分区:600 +``` + +### 1.6 sample + + 数据采样,有三个可选参数:设置是否放回(withReplacement)、采样的百分比(*fraction*)、随机数生成器的种子(seed): + +```scala +val list = List(1, 2, 3, 4, 5, 6) +sc.parallelize(list).sample(withReplacement = false, 0.5).foreach(println) +``` + +### 1.7 union + +合并两个RDD: + +```scala +val list1 = List(1, 2, 3) +val list2 = List(4, 5, 6) +sc.parallelize(list1).union(sc.parallelize(list2)).foreach(println) +// 输出: 1 2 3 4 5 6 +``` + +### 1.8 intersection + +求两个RDD的交集: + +```scala +val list1 = List(1, 2, 3, 4, 5) +val list2 = List(4, 5, 6) +sc.parallelize(list1).intersection(sc.parallelize(list2)).foreach(println) +// 输出: 4 5 +``` + +### 1.9 distinct + +去重: + +```scala +val list = List(1, 2, 2, 4, 4) +sc.parallelize(list).distinct().foreach(println) +// 输出: 4 1 2 +``` + +### 1.10 groupByKey + +按照键进行分组: + +```scala +val list = List(("hadoop", 2), ("spark", 3), ("spark", 5), ("storm", 6), ("hadoop", 2)) +sc.parallelize(list).groupByKey().map(x => (x._1, x._2.toList)).foreach(println) + +//输出: +(spark,List(3, 5)) +(hadoop,List(2, 2)) +(storm,List(6)) +``` + +### 1.11 reduceByKey + +按照键进行归约操作: + +```scala +val list = List(("hadoop", 2), ("spark", 3), ("spark", 5), ("storm", 6), ("hadoop", 2)) +sc.parallelize(list).reduceByKey(_ + _).foreach(println) + +//输出 +(spark,8) +(hadoop,4) +(storm,6) +``` + +### 1.12 sortBy & sortByKey + +按照键进行排序: + +```scala +val list01 = List((100, "hadoop"), (90, "spark"), (120, "storm")) +sc.parallelize(list01).sortByKey(ascending = false).foreach(println) +// 输出 +(120,storm) +(90,spark) +(100,hadoop) +``` + +按照指定元素进行排序: + +```scala +val list02 = List(("hadoop",100), ("spark",90), ("storm",120)) +sc.parallelize(list02).sortBy(x=>x._2,ascending=false).foreach(println) +// 输出 +(storm,120) +(hadoop,100) +(spark,90) +``` + +### 1.13 join + +在一个 (K, V) 和 (K, W) 类型的 dataset 上调用时,返回一个 (K, (V, W)) pairs 的 dataset,等价于内连接操作。如果想要执行外连接,可以使用`leftOuterJoin`, `rightOuterJoin` 和 `fullOuterJoin` 等算子。 + +```scala +val list01 = List((1, "student01"), (2, "student02"), (3, "student03")) +val list02 = List((1, "teacher01"), (2, "teacher02"), (3, "teacher03")) +sc.parallelize(list01).join(sc.parallelize(list02)).foreach(println) + +// 输出 +(1,(student01,teacher01)) +(3,(student03,teacher03)) +(2,(student02,teacher02)) +``` + +### 1.14 cogroup + +在一个 (K, V) 对的 dataset 上调用时,返回多个类型为 (K, (Iterable\, Iterable\))的元组所组成的dataset。 + +```scala +val list01 = List((1, "a"),(1, "a"), (2, "b"), (3, "e")) +val list02 = List((1, "A"), (2, "B"), (3, "E")) +val list03 = List((1, "[ab]"), (2, "[bB]"), (3, "eE"),(3, "eE")) +sc.parallelize(list01).cogroup(sc.parallelize(list02),sc.parallelize(list03)).foreach(println) + +// 输出: 同一个RDD中的元素先按照key进行分组,然后再对不同RDD中的元素按照key进行分组 +(1,(CompactBuffer(a, a),CompactBuffer(A),CompactBuffer([ab]))) +(3,(CompactBuffer(e),CompactBuffer(E),CompactBuffer(eE, eE))) +(2,(CompactBuffer(b),CompactBuffer(B),CompactBuffer([bB]))) + +``` + +### 1.15 cartesian + +计算笛卡尔积: + +```scala +val list1 = List("A", "B", "C") +val list2 = List(1, 2, 3) +sc.parallelize(list1).cartesian(sc.parallelize(list2)).foreach(println) + +//输出笛卡尔积 +(A,1) +(A,2) +(A,3) +(B,1) +(B,2) +(B,3) +(C,1) +(C,2) +(C,3) +``` + +### 1.16 aggregateByKey + +当调用(K,V)对的数据集时,返回(K,U)对的数据集,其中使用给定的组合函数和zeroValue聚合每个键的值。与groupByKey类似,reduce任务的数量可通过第二个参数`numPartitions`进行配置。示例如下: + +```scala +// 为了清晰,以下所有参数均使用具名传参 +val list = List(("hadoop", 3), ("hadoop", 2), ("spark", 4), ("spark", 3), ("storm", 6), ("storm", 8)) +sc.parallelize(list,numSlices = 2).aggregateByKey(zeroValue = 0,numPartitions = 3)( + seqOp = math.max(_, _), + combOp = _ + _ + ).collect.foreach(println) +//输出结果: +(hadoop,3) +(storm,8) +(spark,7) +``` + +这里使用了`numSlices = 2`指定aggregateByKey父操作parallelize的分区数量为2,其执行流程如下: + +
+ +基于同样的执行流程,如果`numSlices = 1`,则意味着只有输入一个分区,则其最后一步combOp相当于是无效的,执行结果为: + +```properties +(hadoop,3) +(storm,8) +(spark,4) +``` + +同样的,如果每个单词对一个分区,即`numSlices = 6`,此时相当于求和操作,执行结果为: + +```properties +(hadoop,5) +(storm,14) +(spark,7) +``` + +最后一个问题是`aggregateByKey(zeroValue = 0,numPartitions = 3)`的第二个参数`numPartitions `决定的是什么?实际上这个参数决定的是输出RDD的分区数量,想要验证这个问题,可以对上面代码进行改写,使用`getNumPartitions`方法获取分区数量: + +```scala +sc.parallelize(list,numSlices = 6).aggregateByKey(zeroValue = 0,numPartitions = 3)( + seqOp = math.max(_, _), + combOp = _ + _ +).getNumPartitions +``` + +
+ +## 二、Action + +下表为spark官网给出的常用的Action算子: + +| Action(动作) | Meaning(含义) | +| -------------------------------------------------- | ------------------------------------------------------------ | +| **reduce**(*func*) | 使用函数*func*执行归约操作 | +| **collect**() | 以一个 array 数组的形式返回 dataset 的所有元素,适用于小结果集。 | +| **count**() | 返回 dataset 中元素的个数。 | +| **first**() | 返回 dataset 中的第一个元素,等价于 take(1)。 | +| **take**(*n*) | 将数据集中的前 *n* 个元素作为一个 array 数组返回。 | +| **takeSample**(*withReplacement*, *num*, [*seed*]) | 对一个 dataset 进行随机抽样 | +| **takeOrdered**(*n*, *[ordering]*) | 按自然顺序(natural order)或自定义比较器(custom comparator)排序后返回前 *n* 个元素。只适用于小结果集,因为所有数据都会被加载到驱动程序的内存中进行排序。 | +| **saveAsTextFile**(*path*) | 将 dataset 中的元素以文本文件的形式写入本地文件系统、HDFS 或其它 Hadoop 支持的文件系统中。Spark 将对每个元素调用 toString 方法,将元素转换为文本文件中的一行记录。 | +| **saveAsSequenceFile**(*path*) | 将 dataset 中的元素以Hadoop SequenceFile 的形式写入到本地文件系统、HDFS 或其它 Hadoop 支持的文件系统中。该操作要求RDD中的元素需要实现 Hadoop 的 Writable 接口。对于Scala语言而言,它可以将Spark中的基本数据类型自动隐式转换为对应Writable类型。(目前仅支持Java and Scala) | +| **saveAsObjectFile**(*path*) | 使用 Java 序列化后存储,可以使用 `SparkContext.objectFile()` 进行加载。(目前仅支持Java and Scala) | +| **countByKey**() | 计算每个键出现的次数。 | +| **foreach**(*func*) | 遍历RDD中每个元素,并对其执行*fun*函数 | + +### 2.1 reduce + +使用函数*func*执行归约操作: + +```scala + val list = List(1, 2, 3, 4, 5) +sc.parallelize(list).reduce((x, y) => x + y) +sc.parallelize(list).reduce(_ + _) + +// 输出 15 +``` + +### 2.2 takeOrdered + +按自然顺序(natural order)或自定义比较器(custom comparator)排序后返回前 *n* 个元素。需要注意的是`takeOrdered`使用隐式参数进行隐式转换,以下为其源码。所以在使用自定义排序时,需要继承Ordering[T]实现自定义比较器,然后将其作为隐式参数引入。 + +```scala +def takeOrdered(num: Int)(implicit ord: Ordering[T]): Array[T] = withScope { + ......... +} +``` + +自定义规则排序: + +```scala +// 继承Ordering[T],实现自定义比较器,按照value值的长度进行排序 +class CustomOrdering extends Ordering[(Int, String)] { + override def compare(x: (Int, String), y: (Int, String)): Int + = if (x._2.length > y._2.length) 1 else -1 +} + +val list = List((1, "hadoop"), (1, "storm"), (1, "azkaban"), (1, "hive")) +// 引入隐式默认值 +implicit val implicitOrdering = new CustomOrdering +sc.parallelize(list).takeOrdered(5) + +// 输出: Array((1,hive), (1,storm), (1,hadoop), (1,azkaban) +``` + +### 2.3 countByKey + +计算每个键出现的次数: + +```scala +val list = List(("hadoop", 10), ("hadoop", 10), ("storm", 3), ("storm", 3), ("azkaban", 1)) +sc.parallelize(list).countByKey() + +// 输出: Map(hadoop -> 2, storm -> 2, azkaban -> 1) +``` + +### 2.4 saveAsTextFile + +将 dataset 中的元素以文本文件的形式写入本地文件系统、HDFS 或其它 Hadoop 支持的文件系统中。Spark 将对每个元素调用 toString 方法,将元素转换为文本文件中的一行记录。 + +```scala +val list = List(("hadoop", 10), ("hadoop", 10), ("storm", 3), ("storm", 3), ("azkaban", 1)) +sc.parallelize(list).saveAsTextFile("/usr/file/temp") +``` + + + + + +## 参考资料 + +[RDD Programming Guide](http://spark.apache.org/docs/latest/rdd-programming-guide.html#rdd-programming-guide) + diff --git a/pictures/spark-aggregateByKey.png b/pictures/spark-aggregateByKey.png new file mode 100644 index 0000000000000000000000000000000000000000..7888b4a4f85ae1d69c2404a815fa3580b1e5a9a2 GIT binary patch literal 68895 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%0DIq_vk?l|>K~poE5c%ZB9mkSCVqf$VVdsNInJH^L zcfa}2bLxY(vaiKO*qyO|9s+1#UqWv#*1>M+` zu+o#msNXpvF_N?(ihbnk`@V>7;`}k}S`K7-6&3!#`@w}KRb>oYJT>YCRpk*jc%mmM z@%+g@yIbq>JF(mPoT|x9eTZV$LWnby*67RO}Wuv_N z|9;klGTH2jT*OC?UkO4E6xW{?rS?sI(T)$%Q~1xkQX#GbOBu;5=T&AAYhEC&|CU_K zm`bQFrTyMSl9u-i0TR>{ilDk&ypx(XXxy}ED&+Y;hXBO@=~W@pjEWkDv7@II_PW?` zc-Nk!Kq0uo_O65{F#amYij^(OP`c!-w0!H3B;)I1A;G{*pIgy|Gfz|;!U13 zHZ_mr+L7(rFQLX{6*JdYxGJ%xaH4$J)*PEzwsh&t?-^|z$R8=QixRn%Qt(u(OF2U^ zxO>{Jn9y~_)qZz&vRhqkXYl6VTh2Y40vO(HV-s8nk3z>shL^1A_6wc-jr^GRdIkR1 zr=miQAucW}pS?Cd)jerm2z=^y_4x1Crx)BxP5b4Xt9~}MK`0d#ZwBwmMe*|tM7};Sc!d0Z7^{(*~_oVa{*}e zJ+y4z16kpPKoiW7Ew1-HxiHwI$NZ#`Tck<KQgFMV_+%0-!AW?dZH`9P$0R^3;?# z=%BQoC8P;OKIsEt6?$MhQoNiEhU=+UI9L>LbYIEMw)R>BKV?=)4niz@{Ve6e%)!L3 zi}J%lycE$0!h!=p{XEyXkQN3i6ZiA-VxoFiQocS$9L_=7JGaqnfeGVtUFe$JuM>pz}xSk0hrp@@THeBy!&;r)iOL-sI1CUmu`Ckb4 z{X5)AyC<%>R;3ZYEO|PBWzg__|KXb~`AdBeC61s?#EE>iBtMlNy=sxPyfoYnRFS`` z(U)Lfl#iAlEI;;Kt(;XWlFe1@6#bI}_Dx#~M)U%P{FoQapH>A(T+}vM~ydV}hB+Nnr O4>>7C$ue={fd2!VnsQ43 literal 0 HcmV?d00001 diff --git a/pictures/spark-getpartnum.png b/pictures/spark-getpartnum.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c352e77429af1036efc968f5a09a99b15d1081 GIT binary patch literal 13397 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 literal 0 HcmV?d00001