4. RDD操作

一、 RDD创建

1. 从本地文件系统中加载数据创建RDD

  • sc:SparkContext的创建

shell创建sc


  • 从文件系统中加载数据创建RDD
>> lines = sc.textFile("file:///home/zt/my.txt")
>> lines
>> lines.foreach(print)

创建RDD


2. 从HDFS加载数据创建RDD

  • 启动hdfs
start-all.sh

hdfs加载数据

  • 上传文件
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

  • 停止hdfs
stop-all.sh

停止hdfs

3. 通过并行集合(列表)创建RDD

  • 输入列表、字符串、numpy生成数组

输入


二、 RDD操作

转换操作

1. filter(func)

含义:筛选出满足函数func的元素,并返回一个新的数据集

  • 显式定义函数
>>> def f(line):
...     b = "spark" in line
...     return(b)
... 
>>> t = lines.filter(f)
>>> t.foreach(print)

filter2

  • lambda函数
>>> lines = sc.textFile('file:///home/zt/my.txt')
>>> linesWithSpark = lines.filter(lambda line: "spark" in line)
>>> linesWithSpark.foreach(print)

filter1


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)

map1

2、lambda函数

>>> lines = sc.textFile("file:///home/zt/my.txt")
>>> words = lines.map(lambda line:line.split(" "))
>>> words.foreach(print)

map2


  • 数字加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)

map3

2、lambda函数

>>> data = [1,2,3,4,5]
>>> rdd1 = sc.parallelize(data)
>>> rdd2 = rdd1.map(lambda x:x+100)
>>> rdd2.foreach(print)

map4


  • 字符串加固定前缀

1、显示定义函数

>>> data = ['python', 'hadoop', 'spark']
>>> rdd = sc.parallelize(data)
>>> def zz(x):
...     return "good"+x
... 
>>> rdd2 = rdd.map(zz)
>>> rdd2.foreach(print)

map5

2、lambda函数

>>> data = ['python', 'hadoop', 'spark']
>>> rdd1 = sc.parallelize(data)
>>> rdd2 = rdd1.map(lambda x:"good"+x)
>>> rdd2.foreach(print)

map6


3. flatMap(func)

类似于map,但是每一个输入元素可以被映射为0或多个输出元素(所以func应该返回一个序列,而不是单一元素)

  • 分词
>>> lines = sc.textFile('file:///home/zt/my.txt')
>>> words = lines.flatMap(lambda line:line.split(" "))
>>> words.foreach(print)

flatMap1


  • 单词映射成键值对
>>> lines = sc.textFile('file:///home/zt/my.txt')
>>> words = lines.flatMap(lambda line:line.split()).map(lambda word:(word,1))
>>> words.foreach(print)

flatMap2


4. reduceByKey()

按照相同的key,对value进行聚合(求和),在进行计算时要求元素必须时键值对形式的:(Key - Value类型)

  • 统计词频,累加
>>> data = [(key,value)]
>>> words = sc.parallelize(data)
>>> words2  = words.reduceByKey(lambda a,b:a+b)
>>> words2.foreach(print)

reduceByKey1


  • 乘法规则
>>> data = [(key,value)]
>>> words = sc.parallelize(data)
>>> words2  = words.reduceByKey(lambda a,b:a*b)
>>> words2.foreach(print)

reduceByKey2


5. groupByKey()

按照key对RDD中的value进行分组,从而生成单一的序列。

  • 单词分组
>>> data = [(key,value)]
>>> words = sc.parallelize(data)
>>> words2.groupByKey().foreach(print)

groupByKey1


  • 查看分组的内容
>>> data = [(key,value)]
>>> words = sc.parallelize(data)
>>> for i in words.groupByKey().collect():
...     print(str(i[0])+':'+str([x for x in i[1]]))

groupByKey2


  • 分组之后做累加map
>>> data = [(key,value)]
>>> words = sc.parallelize(data)
>>> words.groupByKey().map(lambda x: (x[0],sum(x[1]))).foreach(print)

groupByKey3


6. sortByKey()

  • 词频统计按单词排序
>>> data = [(key,value)]
>>> words = sc.parallelize(data)
>>> words.sortByKey().foreach(print)

sortByKey


7. sortBy()

  • 词频统计按词频排序
>>> data = [(key,value)]
>>> words.sortBy(lambda x:x[1], True).collect()
>>>
>>> words.sortBy(lambda x:x[1], False).collect()

sortBy


行动操作

1. foreach(func)——通过函数func(输入两个参数并返回一个值)聚合数据集中的元素

  • foreach(print)

foreach

  • foreach(lambda a:print(a.upper()))

foreach2


2. collect()——以数组的形式返回数据集的所有元素

collect


3. count()——返回数据集中的元素个数

count


4.first()——返回数据集中的第一个元素

first


5. take(n)——以数组的形式返回数据集中的前n个元素

take


6. reduce(func) ——通过函数func(输入两个参数并返回一个值)聚合数据集中的元素

  • 数值型的rdd元素做累加

reduce

  • 与reduceByKey区别

reduce——将RDD中元素前两个传给输入函数,产生一个新的return值,新产生的return值与RDD中下一个元素(第三个元素)组成两个元素,再被传给输入函数,直到最后只有一个值为止。

redeceByKey——对元素为KV对的RDD中Key相同的元素的Value进行binary_function的reduce操作,因此,Key相同的多个元素的值被reduce为一个值,然后与原RDD中的Key组成一个新的KV对。

posted @ 2022-03-25 10:50  ztop  阅读(224)  评论(0编辑  收藏  举报