Spark RDD操作

来源:互联网 发布:上海网站建设优化 编辑:程序博客网 时间:2024/04/30 18:40

RDD支持两种操作

转换(transformation)现有的RDD通过装换(函数)生成新的RDD,转换是延时操作(lazy

动作(action)RDD上运行计算后,返回结果给驱动程序或者写入文件系统


全部的RDD API 文档 

一下介绍的只是经常使用的一些API

——Transformation——

  • map(func)
返回一个新的分布式数据集(dataset),由每一个输入元素经过函数func函数转化后组成
scala> val rdd1 = sc.parallelize(1 to 10);
scala> val rdd2 = rdd1.map(_*2);
  Array[Int]  = Array(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

  • filter(func)
返回一个新数据集,经由func函数计算后返回值为true的输入元素组成
val rdd3 = rdd2.filter(_>10)
  Array(12, 14, 16, 18, 20)
  • flatMap
类似于map,但是每一个输入元素可以被映射为0或者多个输出元素(因此应该返回一个序列,而不是单一元素)
val kv = sc.parallelize(List(List(1,2),List(3,4),List(3,6,8)));
scala> kv.flatMap(x=>x.map(_+1)).collect
 Array[Int]  = Array(2, 3, 4, 5, 4, 7, 9)
  • mapPartitions(func)
类似于map,但是独立地在RDD的每一个分块上运行,因袭在类型为T的RDD上运行时,func的函数类型必须是Iterator[T]=>Iterator[U].mapPartitions将会被每一个数
据集分区调用一次,各个数据集分区的全部内容将作为顺序的数据流传入函数的func的参数中,func必须返回另一个Iterator[T].被合并的结果自动转换成为新的RDD
测试如下:
scala> val rdd4 = sc.parallelize (1 to 9 , 3)
scala> def myfunc[T]  ( iter : Iterator [T]  ) : Iterator [( T , T ) ] = {
          var res = List [(T , T) ]()
          var pre = iter.next
          while ( iter.hasNext )
          {
            val cur = iter . next ;
             res .::= ( pre , cur )
            pre = cur ;
        }
        res . iterator
      }
scala>rdd4.mapPartitions(myfunc).collect

res2: Array[(Int, Int)] = Array((2,3), (1,2), (5,6), (4,5), (8,9), (7,8))
  • mapPartitionsWithIndex(func)
类似于mapPartitions,函数原型:mapPartitionsWithIndex [ U : ClassTag ]( f : ( Int , Iterator [ T ]) => Iterator [ U ] , preservesPartitioning : Boolean = false ) : RDD [ U ], 
func接受两个参数,第一个参数是分区索引,第二个是一个数据集分区的迭代器。而输出的是一个包含经过该函数转化的迭代器。下面测试中,将分区索引和分区数据一起输出
测试如下:
 scala> val rdd = sc.parallelize(1 to 10,3)
scala> def myfunc(index:Int,iter:Iterator[Int] ):Iterator[String] ={
iter.toList.map(x=>index+"-"+x).iterator

scala> rdd.mapPartirionWithIndex().collect
 Array[String]  = Array(0-1, 0-2, 0-3, 1-4, 1-5, 1-6, 2-7, 2-8, 2-9, 2-10) 
  • sample
根据fraction 指定的比例,对数据进行采样,可以选择是否用随机数进行替换,seed用于指定随机数生成器种子

  • union(otherDataset)
返回一个新的数据集,新数据集是由原数据集和参数数据集执行“联合”操作完成
  • intersection(otherDataset)
 集合的交集

  • groupByKey(numTasks)
在一个(K,V)对的数据集上调用,返回一个(K,Seq[V])对的数据集
  • reduceByKey(func,[numTasks])
在一个(K,V)对的数据集上调用,K必须实现Ordered接口,返回一个按照Key进行排序的(K,V)对数据集,使用reduce函数,将相同key的值聚合到一起,类似groupByKey,reduce任务个数由第二个参数指定。
  • sortByKey([ascending],[numTasks])
在一个(K,V)对的数据集上调用,K必须实现Ordered接口,返回一个按照Key进行排序的(K,V)对数据集,升序或者降序由ascending布尔参数决定
  • jion(otherDataset,[numTask])
在类型为(K,V)和(K,W)的数据集上调用,返回一个相同key对应的所有元素对在一起的(K,(V,W))数据集
  • cogroup(otherDataset,[numTasks])
类型为(K,V )和(K,W)的数据集上调用,返回一个(K,(Seq[V],Seq[W])元素的数据集。这个操作也可以称作groupwith
  • cartesion(otherDataset)
笛卡儿积,在类型T和U类型的数据集上调用时,返回一个(T,U)对的数据集(笛卡尔积形式的两两的元素对)
  • pipe(commad,[envVars])
通过Posix管道来将每个RDD分区的数据传入一个shell命令(例如Perl或者bash脚本),RDD元素会写入到进程的标准输入,其标准数据会最为RDD字符串返回
  • coalesce(numPartitions)
将RDD分区的数据量降低为numPartitions,在大数据在线过滤处理之后不需要太多分片时调整分片能够增加性能
  • repartition(nunPartitions)
随机重新shuffle RDD中数据,并创建numPartitions个分区。这个操作会引起通过网络的shuffle数据




——ACTIONS——
  • reduce(func)
通过函数func(接受两个参数返回 一个参数)积极数据集中的所有元素,这个功能必须可交换且可关联,从而可以正确的被并行执行
  • collect()
在驱动程序中,以数组的形式,返回数据集的所有元素。这通常会通过filter等操作返回一个小型数据集
  • count()
返回数据集元素的个数
  • first()
返回数据集元素的第一个元素【take(1)】
  • take(n)
返回一个数据集的前n个元素组成的数组。
  • countByKey()
对(K,V)类型的RDD有效,返回一个(K,Int)对的Map,表示每一个key对应的元素个数

  • foreach(func)
在数据集的每一个元素上,运行函数的func进行更新。这通常用于边缘效果,例如更新一个累加器,或者和外部存储系统进行交互,例如Hbase
  • takeSample(withReplacement,num,seed)
返回一个数组,在数据集中随机采样num个元素组成,可以选择是否用随机数替换不足的部分,Seed用于指定的随机数生成器种子
  • takeOrdered(n,[ordering])
返回一个由数据集的前n个元素组成的有序数据,使用自然序或者自定义的比较器
  • saveAsTextFile(path)
将数据集的元素,以textFile的形式,保存到本地文件系统,HDFS或者任何其他hadoop支持的文件系统。对于每个元素,Spark将会调用tostring方法,将它转为文件中的文本行
  • saveAsSequenceFile(path)
将实现了hadoop 的Writable接口的RDD以hadoop sequenceFile的形式写出
  • saveAsObjectFile(path)
将数据集元素写入java序列化的且可以被SparkContex.objectFile()加载的简单格式
0 0
原创粉丝点击