专栏首页编码前线Spark-RDD常用Transformationg与Action操作

Spark-RDD常用Transformationg与Action操作

一、概述

RDD创建后就可以在RDD上进行数据处理。RDD支持两种操作:转换(transformation),即从现有的数据集创建一个新的数据集;动作(action),即在数据集上进行计算后,返回一个值给Driver程序。

RDD 的转化操作是返回一个新的 RDD 的操作,比如 map() 和 filter() ,而行动操作则是向驱动器程序返回结果或把结果写入外部系统的操作,会触发实际的计算,比如 count() 和 first() 。Spark 对待转化操作和行动操作的方式很不一样,因此理解你正在进行的操作的类型是很重要的。如果对于一个特定的函数是属于转化操作还是行动操作感到困惑,你可以看看它的返回值类型:转化操作返回的是 RDD,而行动操作返回的是其他的数据类型。

RDD中所有的Transformation都是惰性的,也就是说,它们并不会直接计算结果。相反的它们只是记住了这些应用到基础数据集(例如一个文件)上的转换动作。只有当发生一个要求返回结果给Driver的Action时,这些Transformation才会真正运行。

这个设计让Spark更加有效的运行。

二、RDD支持的常用Transformation如下:

map(func)

返回一个新的分布式数据集,该数据集由每一个输入元素经过func函数转换后组成

fitler(func)

返回一个新的数据集,该数据集由经过func函数计算后返回值为true的输入元素组成

flatMap(func)

类似于map,但是每一个输入元素可以被映射为0或多个输出元素(因此func返回一个序列,而不是单一元素)

mapPartitions(func)

类似于map,但独立地在RDD上每一个分片上运行,因此在类型为T的RDD上运行时,func函数类型必须是Iterator[T]=>Iterator[U]

mapPartitionsWithSplit(func)

类似于mapPartitons,但func带有一个整数参数表示分片的索引值。因此在类型为T的RDD上运行时,func函数类型必须是(Int,Iterator[T])=>Iterator[U]

sample(withReplacement,fraction,seed)

根据fraction指定的比例对数据进行采样,可以选择是否用随机数进行替换,seed用于随机数生成器种子

union(otherDataSet)

返回一个新数据集,新数据集是由原数据集和参数数据集联合而成

distinct([numTasks])

返回一个包含原数据集中所有不重复元素的新数据集

groupByKey([numTasks])

在一个(K,V)数据集上调用,返回一个(K,Seq[V])对的数据集。注意默认情况下,只有8个并行任务来操作,但是可以传入一个可选的numTasks参数来改变它

reduceByKey(func,[numTasks])

在一个(K,V)对的数据集上调用,返回一个(K,V)对的数据集,使用指定的reduce函数,将相同的key的值聚合到一起。与groupByKey类似,reduceByKey任务的个数是可以通过第二个可选参数来设置的

sortByKey([[ascending],numTasks])

在一个(K,V)对的数据集上调用,K必须实现Ordered接口,返回一个按照Key进行排序的(K,V)对数据集。升序或降序由ascending布尔参数决定

join(otherDataset0,[numTasks])

在类型为(K,V)和(K,W)数据集上调用,返回一个相同的key对应的所有元素在一起的(K,(V,W))数据集

cogroup(otherDataset,[numTasks])

在类型为(K,V)和(K,W)数据集上调用,返回一个(K,Seq[V],Seq[W])元祖的数据集。这个操作也可以称为groupwith

cartesain(ohterDataset)

笛卡尔积,在类型为T和U类型的数据集上调用,返回一个(T,U)对数据集(两两的元素对)

三、RDD支持的常用action如下表

reduce(func)

通过函数func(接收两个参数,返回一个参数)聚集数据集中的所有元素。这个功能必须可交换且可关联的,从而可以正确的并行运行

collect()

在驱动程序中,以数组形式返回数据集中的所有元素。通常在使用filter或者其他操作返回一个足够小的数据子集后再使用会比较有用

count()

返回数据集元素个数

first()

返回数据集第一个元素(类似于take(1))

take(n)

返回一个由数据集前n个元素组成的数组

注意 这个操作目前并非并行执行,而是由驱动程序计算所有的元素

takeSample(withReplacement,num,seed)

返回一个数组,该数组由从数据集中随机采样的num个元素组成,可以选择是否由随机数替换不足的部分,seed用户指定随机数生成器种子

saveAsTextFile(path)

将数据集的元素以textfile的形式保存到本地文件系统—HDFS或者任何其他Hadoop支持的文件系统。对于每个元素,Spark将会调用toString方法,将它转换为文件中的文本行

saveAsSequenceFile(path)

将数据集中的元素以Hadoop sequencefile的格式保存到指定的目录下,可以是本地系统、HDFS或者任何其他的Hadoop支持的文件系统。这个只限于由key-value对组成,并实现了Hadoop的Writable接口,或者可以隐式的转换为Writable的RDD(Spark包括了基本类型转换,例如Int、Double、String等)

countByKey()

对(K,V)类型的RDD有效,返回一个(K,Int)对的map,表示每一个key对应的元素个数

foreach(func)

在数据集的每一个元素上,运行函数func进行更新。通常用于边缘效果,例如更新一个叠加器,或者和外部存储系统进行交互,如HBase

本文分享自微信公众号 - 编码前线(gh_acef1225aadd)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 布隆过滤器(Bloom Filter)详解

    直观的说,bloom算法类似一个hash set,用来判断某个元素(key)是否在某个集合中。 和一般的hash set不同的是,这个算法无需存储key的值,对...

    用户1205080
  • Flink 1.7.0 安装、配置与使用

    Apache Flink是一个面向分布式数据流处理和批量数据处理的开源计算平台,它能够基于同一个Flink运行时,提供支持流处理和批处理两种类型应用的功能。

    用户1205080
  • JAVA面试50讲之5:Vector,ArrayList,LinkedList的区别

    一组”对立”的元素,通常这些元素都服从某种规则   1.1) List必须保持元素特定的顺序   1.2) Set不能有重复元素   1.3) Queue保持一...

    用户1205080
  • CSS 基础系列:水平垂直居中方案

    比较全面的水平垂直居中方案。水平垂直居中问题大体分为两类,一类目标元素是行内元素,一类目标元素是块级元素(其中,块级元素又包括定宽高和不定宽高)。

    Chor
  • 资源 | 从医疗语音到灾难响应,这八大优质数据集快抱走

    大数据文摘
  • Python常用函数整理

    你好我是森林
  • 如何比较一个List对象Java 7 vs Java 8

    程序你好
  • HTML基础知识入门

    剽悍一小兔
  • 用数据讲故事:七种不同的数据展示方法

    ? 什么使一个故事真正成为数据驱动呢?在某种程度上,数字不再仅仅是出现在侧栏的表格,而是能够在真正意义上促进故事的发展。 数据可以帮助我们用不同视角叙述不同类...

    钱塘数据
  • 编程小白 | 每日一练(33)

    这道理放在编程上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从编程小白进阶到高手,需要经历的是日积月累的学习,那么如何学习呢?当然是每天都...

    C语言入门到精通

扫码关注云+社区

领取腾讯云代金券