Apache Spark:RDD变换

map : 映射

映射变换使用一个映射函数对RDD中的每个记录进行变换,每个记录变换后的新值集合构成一个新的RDD。

语法

def map[U](f: (T) => U)(implicit arg0: ClassTag[U]): RDD[U]

参数

  • f : 映射函数 , 输入参数为原RDD中的一个记录,返回值构成新RDD中的一个记录。

示例

下面的示例将textFile的每个记录(字符串)变换为其长度值,获得一个新的RDD,然后取回第一个记录查看:

scala> textFile.map(line=>line.length).first()
res13:Int = 14

使用RDD的map方法构造一个逐记录变换的新RDD!

filter : 过滤

过滤变换使用一个筛选函数对RDD中的每个记录进行筛选,只有筛选函数返回真值的记录,才 被选中用来构造新的RDD。

语法

def filter(f: (T) => Boolean): RDD[T]

参数

  • f : 筛选函数 , 输入参数为原RDD中的一个元素,返回值为True或False 。

示例

下面的示例仅保留原RDD中字符数多于20个的记录(行),获得一个新的RDD,然后取回第一个 记录查看:

scala> textFile.filter(line=>line.length>20).first()
res20: String = Spark is a fast and generic ...

使用RDD的filter方法筛选想要的记录!

sample : 采样

采样变换根据给定的随机种子,从RDD中随机地按指定比例选一部分记录,创建新的RDD。采样变换 在机器学习中可用于进行交叉验证。

语法

def sample(withReplacement: Boolean, fraction: Double, seed: Long = Utils.random.nextLong): RDD[T]

参数

  • withReplacement : Boolean , True表示进行替换采样,False表示进行非替换采样
  • fraction : Double, 在0~1之间的一个浮点值,表示要采样的记录在全体记录中的比例
  • seed :随机种子

示例

下面的示例从原RDD中随机选择20%的记录,构造一个新的RDD,然后返回新RDD的记录数:

scala> textFile.sample(true,0.2).count()
res12: Long = 26

使用RDD的sample方法获得一个采样RDD!

union : 合并

合并变换将两个RDD合并为一个新的RDD,重复的记录不会被剔除。

语法

def union(other: RDD[T]): RDD[T]

参数

  • other : 第二个RDD 示例

下面的示例,首先对textFile这个RDD进行一个每行反转的映射变换,获得一个新的RDD,再 将这个新的RDD和原来的RDD:textFile进行合并,最后我们使用count查看一下总记录数:

scala> textFile.map(line=>line.reverse).union(textFile).count()
res13: Long = 282   

可以看到,合并后的总记录数是原来的2倍。

使用RDD的union方法,可以获得两个RDD的并集!

intersection : 相交

相交变换仅取两个RDD共同的记录,构造一个新的RDD。

语法

def intersection(other: RDD[T]): RDD[T]

参数

  • other : 第二个RDD 示例

下面的示例将每个记录进行逆转后的RDD与原RDD相交,获得一个新的RDD,我们使用collect回收全部 数据以便显示:

scala> textFile.map(line=>line.reverse).intersection(textFile).collect()
res27: Array[String] =Array("   ","")

可以看到,只有空行被保留下来,因为空行的逆序保持不变。

使用RDD的intersection方法,可以获得两个RDD的交集!

distinct : 剔重

剔重变换剔除RDD中的重复记录,返回一个新的RDD。

语法

def distinct(): RDD[T]

示例

下面的示例将RDD中重复的行剔除,并返回新RDD中的记录数:

scala> textFile.distinct().count()
res20: Long =91

使用RDD的distinct方法,可以进行记录剔重!

全部评论(0)