Spark RDD---api(map&reduce)

来源:互联网 发布:淘宝买家恶意拍下单 编辑:程序博客网 时间:2024/04/29 23:20
RDD简介
RDD是spark中的抽象数据结构,任何数据在Spark中都被表示为RDD。RDD可被看成一个数组,但RDD中的数据是可以分区存储的,能够分布在不同的机器上。Spark应用程序就是把需要处理的数据转化为RDD,然后进行一系列的transforms(转换)action(操作/执行),从而得到结果
RDD的创建
1、将数组转化为RDDval a = sc.parallelize(1 to 9)  //可以用(1 to 9, 3)设置三个分区a: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDDa.collectArray[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
2、从文件系统中的文件创建RDD(我这里用的是HDFS)val a = sc.textFile("sparkApp/wordcount/input/score.txt")a: org.apache.spark.rdd.RDD[String] = sparkApp/wordcount/input/score.txt MapPartitionsRDDa.collectArray[String] = Array(aa 78, bb 98, aa 80, cc 98, aa 69, cc 87, bb 97, cc 86, aa 97, bb 78, bb 34, cc 85, bb 92, cc 72, bb 33, bb 23)
map
map是对RDD中的每个元素都执行一个指定的函数来产生一个新的RDD。任何原RDD中的元素在新RDD中都有且只有一个元素与之对应。val a = sc.parallelize(1 to 9)val b = a.map(x => x * x)b: org.apache.spark.rdd.RDD[Int] = MapPartitionsRDDb.collectArray[Int] = Array(1, 4, 9, 16, 25, 36, 49, 64, 81)该实例将原RDD中的每一个元素进行平方来产生对应的新RDD
mapValues
输入函数应用于RDD中Kev-ValueValue,原RDD中的Key保持不变,与新的Value一起组成新的RDD中的元素。因此,该函数只适用于元素为KV对的RDD。val a = sc.parallelize(List("dog", "tiger", "lion", "cat", "panther", "eagle"))val b = a.map(x => (x.length, x))val c = b.mapValues("-----" + _ + "-----")c.collectArray[(Int, String)] = Array((3,-----dog-----), (5,-----tiger-----), (4,-----lion-----), (3,-----cat-----), (7,-----panther-----), (5,-----eagle-----))
flatMap
map类似,区别是原RDD中的元素经map处理后只能生成一个元素,而原RDD中的元素经flatmap处理后可生成多个元素来构建新RDD。(下面进行比较)val a = sc.parallelize(1 to 4)a.map(x => 1 to x).collectArray[scala.collection.immutable.Range.Inclusive] = Array(Range(1), Range(1, 2), Range(1, 2, 3), Range(1, 2, 3, 4))a.flatMap(x => 1 to x).collectArray[Int] = Array(1, 1, 2, 1, 2, 3, 1, 2, 3, 4)
flatMapValues
flatMapValues类似于mapValues,不同的在于flatMapValues应用于元素为KV对的RDD中Value。每个一元素的Value被输入函数映射为一系列的值,然后这些值再与原RDD中的Key组成一系列新的KV对。val a = sc.parallelize(Array((1,2),(3,4),(5,6)))val b = a.flatMapValues(x => x to 7)b.collectArray[(Int, Int)] = Array((1,2), (1,3), (1,4), (1,5), (1,6), (1,7), (3,4), (3,5), (3,6), (3,7), (5,6), (5,7))
reduce
reduce将RDD中元素两两传递给输入函数,同时产生一个新的值,新产生的值与RDD中下一个元素再被传递给输入函数直到最后只有一个值为止。val a = sc.parallelize(1 to 10)a.reduce((x, y) => x * y)Int = 3628800以上为从1乘到10
reduceByKey
顾名思义,reduceByKey就是对元素为KV对的RDD中Key相同的元素的Value进行reduce.因此,Key相同的多个元素的值被reduce为一个值,然后与原RDD中的Key组成一个新的KV对。val a = sc.parallelize(Array(("asd", 1),("bv", 1),("asd", 1)))a.reduceByKey((x,y) => x + y).collectArray[(String, Int)] = Array((asd,2), (bv,1))以上key为"asd"的value值相加,与"asd"组成新的kv对。

更多API

原创粉丝点击