目录
RDD的创建
读取HDFS上文件数据
RDD分区指定
RDD的创建
将python数据转为rdd
# 将Python数据转为rdd
data = [1,2,3,4]
res = sum(data) # 使用python的方法计算时,采用的单机资源计算,如果数据量较大时,可以将python数据转为spark的rdd数据,就可以借助spark的进行的分布式计算
print(res)
将python的列表转换为rdd
# 将pytho的列表数据转为rdd,需要使用pyspark中的sparkcontext类,该类中封装转化方法
from pyspark import SparkContext
# 1-先将类生成对象
# master 可以指定资源调度方式 不指定默认是local
# sc = SparkContext(master='yarn')
sc = SparkContext()
# 2-使用对象方法将python的列表转为rdd
# parallelize 将python的列表 ,元组,字典,转为 rdd,常用列表
rdd = sc.parallelize(data)
# 3-使用rdd提供的方法进行分布式聚合计算
res1 = rdd.reduce(lambda x,y:x+y)
# 查看计算结果
print(res1)
读取HDFS上文件数据
首先需要在hdfs的data目录下上传数据
读取hdfs的文件数据
# 创建rdd
# 读取hdfs的文件转换为rdd
from pyspark import SparkConf, SparkContext
# 1-创建对象
sc = SparkContext()
# 2-读取hdfs的文件数据
# 指定读取的文件路径
rdd1 = sc.textFile('hdfs://node1:8020/data/stu.txt')
# 指定读取目录,可以读取目录下的所有文件数据
rdd2 = sc.textFile('hdfs://node1:8020/data')
# 3-查看rdd中读取数据
res = rdd1.collect()
print(res)
res = rdd2.collect()
print(res)
读取单个文件,值输出指定文件的数据
读取到目录,会将整个目录的文件都读取到
RDD分区指定
python数据转换rdd指定分区
from pyspark import SparkContext
# 数据在转化为rdd时,可以指定拆成多少个分区,也就是拆成多少份
# python数据转为rdd时指定分区数据
# 1-创建对象
sc = SparkContext()
data = [1,3,5,8,11,6,5,19]
# 2-指定分区数
# 转化rdd时指定分区数
# numSlices 指定分区的数量
rdd = sc.parallelize(data,numSlices=4) # [[1, 3], [5, 8], [11, 6], [5, 19]]
rdd = sc.parallelize(data,numSlices=6) # [[1], [3], [5, 8], [11], [6], [5, 19]]
# 查看分区后的数据形式 glom()查看分区形式
res = rdd.glom().collect()
print(res)
如果指定的分区数量不能够整除,则会随机分配
读取hdfs上的数据
from pyspark import SparkContext
# 数据在转化为rdd时,可以指定拆成多少个分区,也就是拆成多少份
# python数据转为rdd时指定分区数据
# 1-创建对象
sc = SparkContext()
# 读取的文件指定分区数
# 文件在进行分区时,有时候会多一个空分区
# 文件大小%3 = 值 -- 余数
# 余数/值 占比 超过10%额外会创建一个空分区
rdd2 = sc.textFile("hdfs://node1:8020/data/stu.txt",minPartitions=4) # [['1,alice,F'], ['2,Tom,M'], ['3,lili,F'], []]
# rdd2 = sc.textFile("hdfs://node1:8020/data/stu.txt",minPartitions=2) # [['1,alice,F'], ['2,Tom,M'], ['3,lili,F']]
# 查看分区后的数据形式 glom()查看分区形式
res2 = rdd2.glom().collect()
print(res2)
文件大小%3 = 值 -- 余数 余数/值 占比 超过10%额外会创建一个28B % 4 = 6..4
4/6 > 10% 所以会出现一个空的分区
---------------------------------------------
28B % 2 = 14...0
0/14 < 10% ,没有空分区