Spark学习之键值对(pair RDD)操作(3)

Spark学习之键值对(pair RDD)操作(3)

1. 我们通常从一个RDD中提取某些字段(如代表事件时间、用户ID或者其他标识符的字段),并使用这些字段为pair RDD操作中的键。

2. 创建pair RDD

1)读取本身就是键值对的数据
2)一个普通的RDD通过map()转为pair RDD,传递的函数需要返回键值对。
Python中使用第一个单词作为键创建出一个pair RDD
    pairs = lines.amp(lambda x: (x.split(" ")[0],x))
Scala中使用第一个单词作为键创建出一个pair RDD
    val pairs = lines.map(x=>(x.split(" ")(0),x))

3. pair RDD的转化操作

pair RDD可以使用所有标准RDD上的可能的转化操作,还有其他如下

reduceBykey(func)       合并具有相同键的值

groupByke()             对具有相同键的值进行分组

combineByKey(           使用不同的的返回类型合并具有相同键的值
createCombiner,
mergeValue,
mergCombiners,
partitioner)

mapValues(func)         对pair RDD中的每个值应用一个函数而不改变键

flatMapValues(func)     对pair RDD中的每个值应用一个返回迭代器的函数,
                        然后对返回的每个元素都生成一个对应原键的键值对记录。
                        通常用于符号化。

keys()                  返回一个仅包含键的RDD

values()                返回一个仅包含值的RDD

sortByKey()             返回一个根据键排序的RDD

4. 针对两个pair RDD转化操作

subtractByKey           删掉RDD中键与other RDD中的键相同的元素
join                    对两个RDD进行内连接
rightOuterJoin          对两个RDD进行连接操作,确保第一个RDD的键必须存在(右外连接)
leftOuterJoin           对两个RDD进行连接操作,确保第二个RDD的键必须存在(左外连接)
cogroup                 将两个RDD中拥有相同键的数据分组到一起

5. pair RDD的行动操作

countByKey()            对每个键对应的元素分别计数
collectAsMap()          将结果以映射表的形式返回,以便查询
lookup(key)             返回给定键对应的所有值

6. 数据分区

控制数据分布以获得最少的网络传输可以极大地提升整体性能。
只有当数据集多次在诸如连这种基于键的操作中使用时,分区才有帮助。

Scala自定义分区方式
    val sc = new SparkContext(...)
    val userData = sc.sequenceFile(UserID,UserInfo)("hdfs://...")
                     .partitionBy(new HashPartitioner(100))
                     .persist()

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏伦少的博客

Spark UDF使用详解及代码示例

本文介绍如何在Spark Sql和DataFrame中使用UDF,如何利用UDF给一个表或者一个DataFrame根据需求添加几列,并给出了旧版(Spark1....

1083
来自专栏听Allen瞎扯淡

Spark 的惰性运算

作者的意图很简单,就是将RDD中的数据转换为新的数据格式,并统计非法数据的个数。咋一看代码,似乎没有什么问题,可是,这段代码真的能得到正确的结果么?答案是否定的...

811
来自专栏行者悟空

Spark核心数据结构RDD的定义

1144
来自专栏https://www.cnblogs.com/L

【Spark篇】---SparkSql之UDF函数和UDAF函数

* 根据UDF函数参数的个数来决定是实现哪一个UDF  UDF1,UDF2。。。。UDF1xxx     * UDF1 传一个参数  UDF2传两个参数。。...

752
来自专栏Spark生态圈

[spark] RDD解析

每个具体的RDD都得实现compute 方法,该方法接受的参数之一是一个Partition 对象,目的是计算该分区中的数据。 我们通过map方法来看具体的实现...

621
来自专栏星汉技术

原 SparkSQL语法及API

2315
来自专栏Spark生态圈

[spark] DAGScheduler划分stage源码解析

Spark Application只有遇到action操作时才会真正的提交任务并进行计算,DAGScheduler 会根据各个RDD之间的依赖关系形成一个DAG...

442
来自专栏浪淘沙

Spark Core 学习笔记

1:Spark Core:内核,也是Spark中最重要的部分,相当于Mapreduce                 SparkCore 和 Mapredu...

272
来自专栏牛肉圆粉不加葱

揭开Spark Streaming神秘面纱① - DStreamGraph 与 DStream DAG

在 Spark Streaming 中,DStreamGraph 是一个非常重要的组件,主要用来:

692
来自专栏https://www.cnblogs.com/L

【Spark篇】---Spark中广播变量和累加器

Spark中因为算子中的真正逻辑是发送到Executor中去运行的,所以当Executor中需要引用外部变量时,需要使用广播变量。

641

扫码关注云+社区