4. RDD操作
一、 RDD创建
1. 从本地文件系统中加载数据创建RDD
- sc:SparkContext的创建
- 从文件系统中加载数据创建RDD
>> lines = sc.textFile("file:///home/zt/my.txt")
>> lines
>> lines.foreach(print)
2. 从HDFS加载数据创建RDD
- 启动hdfs
start-all.sh
- 上传文件
hdfs dfs -put 要上传的文件路径 上传目的路径
- 查看文件
hdfs dfs -ls /user/zt/
hdsf dfs cat ./my.txt
- 进入spark加载hdfs文件
>> lines = sc.textFile('hdfs://localhost:9000/user/zt/my.txt')
>> lines.foreach(print)
- 停止hdfs
stop-all.sh
3. 通过并行集合(列表)创建RDD
- 输入列表、字符串、numpy生成数组
二、 RDD操作
转换操作
1. filter(func)
含义:筛选出满足函数func的元素,并返回一个新的数据集
- 显式定义函数
>>> def f(line):
... b = "spark" in line
... return(b)
...
>>> t = lines.filter(f)
>>> t.foreach(print)
- lambda函数
>>> lines = sc.textFile('file:///home/zt/my.txt')
>>> linesWithSpark = lines.filter(lambda line: "spark" in line)
>>> linesWithSpark.foreach(print)
2. map(func)
含义:将每个元素传递到函数func中,并将结果返回为一个新的数据集
- 字符串分词
1、显式定义函数
>>> lines = sc.textFile('file:///home/zt/my.txt')
>>> def tt1(line):
... line = line.split(" ")
... return line
...
>>> words = lines.map(tt1)
>>> words.foreach(print)
2、lambda函数
>>> lines = sc.textFile("file:///home/zt/my.txt")
>>> words = lines.map(lambda line:line.split(" "))
>>> words.foreach(print)
- 数字加100
1、显示定义函数
>>> data = [1,2,3,4,5]
>>> rdd = sc.parallelize(data)
>>> def add(x):
... return x+100
...
>>> line = rdd.map(add)
>>> line.foreach(print)
2、lambda函数
>>> data = [1,2,3,4,5]
>>> rdd1 = sc.parallelize(data)
>>> rdd2 = rdd1.map(lambda x:x+100)
>>> rdd2.foreach(print)
- 字符串加固定前缀
1、显示定义函数
>>> data = ['python', 'hadoop', 'spark']
>>> rdd = sc.parallelize(data)
>>> def zz(x):
... return "good"+x
...
>>> rdd2 = rdd.map(zz)
>>> rdd2.foreach(print)
2、lambda函数
>>> data = ['python', 'hadoop', 'spark']
>>> rdd1 = sc.parallelize(data)
>>> rdd2 = rdd1.map(lambda x:"good"+x)
>>> rdd2.foreach(print)
3. flatMap(func)
类似于map,但是每一个输入元素可以被映射为0或多个输出元素(所以func应该返回一个序列,而不是单一元素)
- 分词
>>> lines = sc.textFile('file:///home/zt/my.txt')
>>> words = lines.flatMap(lambda line:line.split(" "))
>>> words.foreach(print)
- 单词映射成键值对
>>> lines = sc.textFile('file:///home/zt/my.txt')
>>> words = lines.flatMap(lambda line:line.split()).map(lambda word:(word,1))
>>> words.foreach(print)
4. reduceByKey()
按照相同的key,对value进行聚合(求和),在进行计算时要求元素必须时键值对形式的:(Key - Value类型)
- 统计词频,累加
>>> data = [(key,value)]
>>> words = sc.parallelize(data)
>>> words2 = words.reduceByKey(lambda a,b:a+b)
>>> words2.foreach(print)
- 乘法规则
>>> data = [(key,value)]
>>> words = sc.parallelize(data)
>>> words2 = words.reduceByKey(lambda a,b:a*b)
>>> words2.foreach(print)
5. groupByKey()
按照key对RDD中的value进行分组,从而生成单一的序列。
- 单词分组
>>> data = [(key,value)]
>>> words = sc.parallelize(data)
>>> words2.groupByKey().foreach(print)
- 查看分组的内容
>>> data = [(key,value)]
>>> words = sc.parallelize(data)
>>> for i in words.groupByKey().collect():
... print(str(i[0])+':'+str([x for x in i[1]]))
- 分组之后做累加map
>>> data = [(key,value)]
>>> words = sc.parallelize(data)
>>> words.groupByKey().map(lambda x: (x[0],sum(x[1]))).foreach(print)
6. sortByKey()
- 词频统计按单词排序
>>> data = [(key,value)]
>>> words = sc.parallelize(data)
>>> words.sortByKey().foreach(print)
7. sortBy()
- 词频统计按词频排序
>>> data = [(key,value)]
>>> words.sortBy(lambda x:x[1], True).collect()
>>>
>>> words.sortBy(lambda x:x[1], False).collect()
行动操作
1. foreach(func)——通过函数func(输入两个参数并返回一个值)聚合数据集中的元素
- foreach(print)
- foreach(lambda a:print(a.upper()))
2. collect()——以数组的形式返回数据集的所有元素
3. count()——返回数据集中的元素个数
4.first()——返回数据集中的第一个元素
5. take(n)——以数组的形式返回数据集中的前n个元素
6. reduce(func) ——通过函数func(输入两个参数并返回一个值)聚合数据集中的元素
- 数值型的rdd元素做累加
- 与reduceByKey区别
reduce——将RDD中元素前两个传给输入函数,产生一个新的return值,新产生的return值与RDD中下一个元素(第三个元素)组成两个元素,再被传给输入函数,直到最后只有一个值为止。
redeceByKey——对元素为KV对的RDD中Key相同的元素的Value进行binary_function的reduce操作,因此,Key相同的多个元素的值被reduce为一个值,然后与原RDD中的Key组成一个新的KV对。