Spark学习笔记No.05(RDD特性及创建)

1、RDD

分布式计算需要:
分区控制 Shuffle控制 数据存储\序列化\发送 数据计算API等一系列功能
在分布式框架中,需要有一个统一的数据抽象对象,来实现上述分布式计算所需功能
这个抽象对象,就是RDD(弹性分布式数据集)
RDD定义:
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,代表一个不可变、了分区的元素可并行计算的集合
Dataset:一个数据集合,用于存放数据的
Distributed:RDD中的数据是分布式存储的,可用于分布式计算
Resilient:RDD中的数据可以存储在内存或者偏重
RDD的三个特性:
不可变(immutable)不可变集合,变量的声明使用val
分区(partitioned)集合的数据被划分为很多部分,每个部分被称为分区Partition
并行计算(parallel)集合中的数据可以被并行的计算处理,每个分区数据被一个Task任务处理

2、RDD的五大特性

2.1 RDD是有分区的
>>> rdd=sc.parallelize([1,2,3,4,5,6,7,8,9],3)
>>> rdd.glom().collect()
[Stage 0:>                                        [Stage 0:>                                [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
2.2 计算方法都会作用在每一个分区(分片)
>>> rdd=sc.parallelize([1,2,3,4,5,6,7,8,9],5)
>>> rdd.map(lambda x:x*10).collect()
[10, 20, 30, 40, 50, 60, 70, 80, 90]
2.3 RDD之间是有相互依赖关系的

传递依赖关系

2.4 KV型RDD有分区器

KV型可以手动设置(rdd.partitionBy方法设置)分区 依据Hash分区规则

2.5 RDD分区数据的读取会尽量靠近数据所在地

确保并行计算能力前提下,尽量确保本地读取

3、RDD创建和算子

3.1 RDD创建

Spark RDD 编程的程序入口对象是SparkContext对象(不论何种编程语言)
只有构建出SparkContext, 基于它才能执行后续的API调用和计算
本质上, SparkContext对编程来说, 主要功能就是创建第一个RDD出来

#conf = SparkConf().setMaster("local[*]").setAppName("WordCountHelloWorld")
conf=SparkConf().setAppName("WordCountHelloWorld")
# 创建 SparkContext 对象
sc = SparkContext(conf=conf)

RDD的创建主要有2种方式:
• 通过并行化集合创建 ( 本地对象转换成分布式RDD )
• 读取外部数据源 ( 读取文件 )

3.2 并行化集合创建
3.3 读取外部数据源

textFile API 读取文件创建

#coding:utf8

#导入spark相关包
from pyspark import SparkConf,SparkContext
conf=SparkConf().setAppName("test").setMaster("local[*]")
sc=SparkContext(conf=conf)

#通过并行化集合的方式去创建RDD,
rdd=sc.parallelize([1,2,3,4,5,6,7,8,9])
#未确定分区情况下,默认分区
print("默认分区数:",rdd.getNumPartitions())

rdd=sc.parallelize([1,2,3,4,5,6],3)
print("分区数量:",rdd.getNumPartitions())

print("rdd的内容是",rdd.collect())

可以读取本地数据,也可以读取hdfs数据

from pyspark import SparkConf,SparkContext
conf=SparkConf().setAppName("test").setMaster("local[*]")
sc=SparkContext(conf=conf)

file_rdd1=sc.textFile("/home/smith/data/input.txt")
print("默认分区数:",file_rdd1.getNumPartitions())
print("file_rdd1 内容",file_rdd1.collect())

file_rdd2=sc.textFile("/home/smith/data/input.txt",3)
file_rdd3=sc.textFile("/home/smith/data/input.txt",100)
print("file_rdd2的分区数:",file_rdd2.getNumPartitions())
print("file_rdd3的分区数:",file_rdd3.getNumPartitions())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值