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生态圈

[spark streaming] DStream 和 DStreamGraph 解析

Spark Streaming 是基于Spark Core将流式计算分解成一系列的小批处理任务来执行。

1101
来自专栏行者悟空

Spark核心数据结构RDD的定义

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

如何保证一个Spark Application只有一个SparkContext实例

Spark有个关于是否允许一个application存在多个SparkContext实例的配置项, 如下:

813
来自专栏大数据学习笔记

Spark2.x学习笔记:7、Spark应用程序设计

7、 Spark应用程序设计 7.1 基本流程 1.创建SparkContext对象 每个Spark应用程序有且仅有一个SparkContext对象,封装了...

2578
来自专栏浪淘沙

Spark Core 学习笔记

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

2132
来自专栏别先生

Spark核心RDD、什么是RDD、RDD的属性、创建RDD、RDD的依赖以及缓存、

1:什么是Spark的RDD??? RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代...

35010
来自专栏栗霖积跬步之旅

为什么对象序列化要定义serialVersionUID

对于实现了java.io.Serializable接口的实体类来说,往往都会手动声明serialVersionUID,因为只要你实现了序列化,java自己就会默...

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

Spark Task 的执行流程③ - 执行 task

创建、分发 Task一文中我们提到 TaskRunner(继承于 Runnable) 对象最终会被提交到 Executor 的线程池中去执行,本文就将对该执行过...

681
来自专栏悦思悦读

Spark Tips 2: 在Spark Streaming中均匀分配从Kafka directStream 中读出的数据

下面这段code用于在Spark Streaming job中读取Kafka的message: ...... JavaPairInputDStream<Stri...

3187
来自专栏星汉技术

原 荐 Spark框架核心概念

3748

扫码关注云+社区