pyspark

一、基础准备

演示获取pyspark的执行环境入库对象:SparkContext,并且通过SparkContext对象获取当前pyspark的版本

"""
演示获取pyspark的执行环境入库对象:SparkContext
并且通过SparkContext对象获取当前pyspark的版本
"""


# 导包
from pyspark import SparkConf, SparkContext
# 创建SparkConf类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark_app")

"""
上述写法为链式调用(基本原则:调用的返回值为同一个对象)
等价为:
conf = SparkConf()
conf.setMaster("local[*]")
conf.setAppName("test_name")
"""
# 基于SparkConf类对象创建SparkContext对象
sc = SparkContext(conf=conf)

# 打印pyspark的运行版本
print(sc.version)
# 停止SparkContext对象的运行(停止pyspark程序)
sc.stop()

二、数据计算

1.map方法

"""
演示rdd的map成员方法的使用
"""

from pyspark import SparkConf, SparkContext
import os
# python的解释器位置
os.environ['PYSPARK_PYTHON'] = "D:\\02CS\python\python.exe"


conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)

# 准备一个rdd
rdd = sc.parallelize([1, 2, 3, 4, 5])

# 通过map方法将全部数据都×10
# def func(data):
#     return data*10
#

# rdd2 = rdd.map(func)


# 链式调用
rdd2 = rdd.map(lambda x: x*10).map(lambda x: x+5)
print(rdd2.collect())

2.flatMap方法

"""
演示rdd的flatMap成员方法的使用
比map方法多出,解除一层嵌套的功能
"""

from pyspark import SparkConf, SparkContext
import os
# python的解释器位置
os.environ['PYSPARK_PYTHON'] = "D:\\02CS\python\python.exe"


conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)

# 准备一个rdd
rdd = sc.parallelize(["itheima itcast 666", "itheima itheima itcast", "python it java"])

# 需求,将rdd数据里面的一个个单词提取出来
rdd2 = rdd.flatMap(lambda x: x.split(" "))
print(rdd2.collect())


3.distinct方法

"""
演示rdd的distinct成员方法的使用
"""

from pyspark import SparkContext, SparkConf
import os
os.environ['PYSPARK_PYTHON'] = "D:\\02CS\python\python.exe"
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)


# 准备一个rdd
rdd = sc.parallelize([1, 1, 3, 3, 5, 5, 7, 8, 8, 9, 10])

# 对rdd的数据进行过滤
rdd2 = rdd.distinct()

print(rdd2.collect())

4.filter方法

"""
演示rdd的filter成员方法的使用
"""
from pyspark import SparkContext, SparkConf
import os
os.environ['PYSPARK_PYTHON'] = "D:\\02CS\python\python.exe"
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)

# 准备一个rdd
rdd = sc.parallelize([1, 2, 3, 4, 5])

# 对rdd的数据进行过滤
rdd2 = rdd.filter(lambda num: num % 2 == 0)

print(rdd2.collect())

5.reduceByKey方法

"""
演示rdd的reduceByKey成员方法的使用
"""

from pyspark import SparkConf, SparkContext
import os
# python的解释器位置
os.environ['PYSPARK_PYTHON'] = "D:\\02CS\python\python.exe"


conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)

# 准备一个rdd
rdd = sc.parallelize([('男', 99), ('男', 100), ('女', 98), ('女', 60)])

# 求男生和女生两个组的成绩之和
rdd2 = rdd.reduceByKey(lambda a, b: a+b)
print(rdd2.collect())

6.sortBy方法

"""
演示rdd的sortBy成员方法的使用
"""

# 1.构建执行环境入口对象
from pyspark import SparkContext, SparkConf
import os
os.environ['PYSPARK_PYTHON'] = "D:\\02CS\python\python.exe"
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)
# 2.读取数据文件
rdd = sc.textFile("D:\\03计科学习资料\学习资料\python基础+进阶\第15章资料\hello.txt")

# 3.取出全部单词
word_rdd = rdd.flatMap(lambda x: x.split(" "))

# 4.将所有单词转换成二元元组,单词为key,value设置为1
word_with_one_rdd = word_rdd.map(lambda word: (word, 1))

# 5.分组并求和
result_rdd = word_with_one_rdd.reduceByKey(lambda a, b: a+b)

# 6.对结果进行排序
final_rdd = result_rdd.sortBy(lambda x: x[1], ascending=False, numPartitions=1)

# 7.打印输出结果
print(final_rdd.collect())

7.其他算子

7.1 collect算子

功能 :将rdd各个分区内的数据,统一收集到Driver中,形成一个List对象

用法:rdd.collect() 返回值是一个list

7.2 reduce算子

功能:对rdd数据集按照你传入的逻辑进行聚合

代码:

rdd = sc.parallelize(range(1,10))
# 将rdd数据进行累加求和
print(rdd.reduce(lambda a, b: a + b))

返回值等同于计算函数的返回值

7.3 take算子

功能:取rdd的前N个元素,组合成list返回给你

用法:

>>> sc.parallelize([3,2,1,4,5,6]).take(5)

>>> [3,2,1,4,5]

7.4 count算子

功能:计算rdd有多少条数据,返回值是一个数字

用法:

>>> sc.parallelize([3,2,1,4,5,6]).count()

>>> 6

三、数据输入输出

  • 数据输入

sc.parallelize

sc.textFile

"""
演示通过pyspark代码加载数据,即数据输入
"""
from pyspark import SparkConf, SparkContext

conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)
# 通过parallelize方法将python对象加载到spark内,成为rdd对象
# rdd1 = sc.parallelize([1, 2, 3, 4, 5])
# rdd2 = sc.parallelize((1, 2, 3, 4, 5))
# rdd3 = sc.parallelize({1, 2, 3, 4, 5})
# rdd4 = sc.parallelize("abcdefg")
# rdd5 = sc.parallelize({"key1": "value1", "key2": "value2"})
#
# 如果要查看rdd里面有什么内容,需要用collect()方法
# print(rdd1.collect())
# print(rdd2.collect())
# print(rdd3.collect())
# print(rdd4.collect())
# print(rdd5.collect())


# 通过textFile方法,读取文件数据加载到spark内,成为rdd对象
rdd = sc.textFile("D:\\03计科学习资料\学习资料\python基础+进阶\第15章资料\hello.txt")
print(rdd.collect())


sc.stop()

  • 数据输出到文件

rdd.map

rdd.flatMap

rdd.reduceByKey

"""
演示将rdd输出到文件中
"""

from pyspark import SparkContext, SparkConf
import os
os.environ['HADOOP_HOME'] = "D:\hadoop\hadoop-3.0.0"
os.environ['PYSPARK_PYTHON'] = "D:\\02CS\python\python.exe"
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
# conf.set("spark.default.parallelism", "1") # 设置分区方法一
sc = SparkContext(conf=conf)

# 准备rdd1
rdd1 = sc.parallelize([1, 2, 3, 4, 5], numSlices=1)  # 设置分区方法二

# 准备rdd2
rdd2 = sc.parallelize([("Hello", 3), ("Spark", 5), ("Hi", 7)], 1)   # 设置分区方法二

# 准备rdd3
rdd3 = sc.parallelize([[1, 3, 5], [6, 7, 9], [11, 13, 11]], 1)  # 设置分区方法二

# 输出到文件中
rdd1.saveAsTextFile("D:\\02CS\py_code\py_code_text\pyspark_study\output1")
rdd2.saveAsTextFile("D:\\02CS\py_code\py_code_text\pyspark_study\output2")
rdd3.saveAsTextFile("D:\\02CS\py_code\py_code_text\pyspark_study\output3")

四、练习案例

1.练习案例一

  • 完成练习案例:单词计数统计

"""
完成练习案例:单词计数统计
"""


# 1.构建执行环境入口对象
from pyspark import SparkContext, SparkConf
import os
os.environ['PYSPARK_PYTHON'] = "D:\\02CS\python\python.exe"
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)
# 2.读取数据文件
rdd = sc.textFile("D:\\03计科学习资料\学习资料\python基础+进阶\第15章资料\hello.txt")

# 3.取出全部单词
word_rdd = rdd.flatMap(lambda x: x.split(" "))

# 4.将所有单词转换成二元元组,单词为key,value设置为1
word_with_one_rdd = word_rdd.map(lambda word: (word, 1))

# 5.分组并求和
result_rdd = word_with_one_rdd.reduceByKey(lambda a, b: a+b)

# 6.打印输出结果
print(result_rdd.collect())

2.练习案例二

  • 完成练习案例:JSON商品统计, 需求:

    1.各个城市销售额排名,从大到小
    2.全部城市,有哪些商品在售卖
    3.北京市有哪些商品类别

"""
完成练习案例:JSON商品统计
需求:
1.各个城市销售额排名,从大到小
2.全部城市,有哪些商品在售卖
3.北京市有哪些商品类别
"""

# 1.构建执行环境入口对象
from pyspark import SparkContext, SparkConf
import os
import json
os.environ['PYSPARK_PYTHON'] = "D:\\02CS\python\python.exe"
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
sc = SparkContext(conf=conf)

# TODO 需求1:城市销售额排名

# 1.1读取文件得到rdd
file_rdd = sc.textFile("D:\\03计科学习资料\学习资料\python基础+进阶\第15章资料\orders.txt")
# 1.2取出一个个JSON字符串
json_str_rdd = file_rdd.flatMap(lambda x: x.split("|"))
# 1.3将一个个JSON字符串转换为字典
dict_rdd = json_str_rdd.map(lambda x: json.loads(x))
# 1.4取出城市和销售额数据
# (城市,销售额)
city_with_money_rdd = dict_rdd.map(lambda x: (x['areaName'], int(x['money'])))
# 1.5按城市分组按销售额聚合
city_result_rdd = city_with_money_rdd.reduceByKey(lambda a, b: a + b)

# 1.6按销售额聚合结果进行排序
result1_rdd = city_result_rdd.sortBy(lambda x: x[1], ascending=False, numPartitions=1)
print("需求1的结果:", result1_rdd.collect())
# TODO 需求2:全部城市有哪些商品类别在售卖
# 2.1取出全部的商品类别
category_rdd = dict_rdd.map(lambda x: x['category']).distinct()
print("需求2的结果:", category_rdd.collect())
# 2.2对全部商品类别进行去重
# TODO 需求3:北京市有哪些商品类别在售卖
# 3.1过滤北京市的数据
bj_data_rdd = dict_rdd.filter(lambda x: x['areaName'] == '北京')
# 3.2取出全部商品类别
result3_rdd = bj_data_rdd.map(lambda x: x['category']).distinct()
# 3.3进行商品去重
print("需求3的结果:", result3_rdd.collect())


3.练习案例三

  • 读取文件转换成RDD,并完成:

    打印输出:热门搜索时间段(小时精度)Top3
    打印输出:热门搜索词Top3
    打印输出:统计黑马程序员关键字在哪个时段被搜索最多
    将数据转换为JSON格式,写出为文件

"""
读取文件转换成RDD,并完成:
打印输出:热门搜索时间段(小时精度)Top3
打印输出:热门搜索词Top3
打印输出:统计黑马程序员关键字在哪个时段被搜索最多
将数据转换为JSON格式,写出为文件

"""

from pyspark import SparkContext, SparkConf
import os
os.environ['PYSPARK_PYTHON'] = "D:\\02CS\python\python.exe"
os.environ['HADOOP_HOME'] = "D:\hadoop\hadoop-3.0.0"
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
conf.set("spark.default.parallelism", "1")
sc = SparkContext(conf=conf)

# 读取文件转换成rdd
file_rdd = sc.textFile("D:\\03计科学习资料\学习资料\python基础+进阶\第15章资料\search_log.txt")
# TODO 需求1:热门搜索时间段Top3(小时精度)
# 1.1取出全部的时间并转换为小时
# 1.2转换为(小时,1)的二元元组
# 1.3key分组聚合value
# 1.4排序(降序)
# 1.5取前三
result1 = file_rdd.map(lambda x: x.split("\t")).\
    map(lambda x: x[0][:2]).\
    map(lambda x: (x, 1)).\
    reduceByKey(lambda a, b: a + b).\
    sortBy(lambda x: x[1], ascending=False, numPartitions=1).\
    take(3)
print("需求1的结果:", result1)
'''
# 简洁版
file_rdd.map(lambda x: (x.split("\t")[0][:2], 1)).\
    reduceByKey(lambda a, b: a + b).\
    sortBy(lambda x: x[1], ascending=False, numPartitions=1).\
    take(3)
'''

# TODO 需求2:热门搜索词Top3
# 2.1取出全部搜索词
# 2.2(词,1)二元元组
# 2.3分组聚合
# 2.4排序
# 2.5Top3
result2 = file_rdd.map(lambda x: (x.split("\t")[2], 1)).\
    reduceByKey(lambda a, b: a + b).\
    sortBy(lambda x: x[1], ascending=False, numPartitions=1).\
    take(3)
print("需求2的结果:", result2)
# TODO 需求3:统计黑马程序员关键字在什么时段被搜索的最多
# 3.1过滤内容,只保留黑马程序员关键词
# 3.2转换为(小时,1)的二元元组
# 3.3key分组聚合value
# 3.4排序(降序)
# 3.5取前1
result3 = file_rdd.map(lambda x: x.split("\t")).\
    filter(lambda x: x[2] == '黑马程序员').\
    map(lambda x: (x[0][:2], 1)).\
    reduceByKey(lambda a, b: a + b).\
    sortBy(lambda x: x[1], ascending=False, numPartitions=1).\
    take(3)
print("需求3的结果:", result3)

# TODO 需求4:将数据转换为JSON格式,写出到文件中
# 4.1转换为JSON格式的rdd
# 4.2写出为文件
file_rdd.map(lambda x: x.split("\t")).\
    map(lambda x: {"time": x[0], "user_id": x[1], "key_word": x[2], "rank1": x[3], "rank2": x[4], "url": x[5]}).\
    saveAsTextFile("D:\\02CS\py_code\py_code_text\pyspark_study\output_json")


五、总结

1.Spark的编程流程就是:

  • 将数据加载为RDD(数据输入)
  • 对RDD进行计算(数据计算)
  • 将RDD转换为Python对象(数据输出)

2.数据输出的方法

  • collect:将RDD内容转换为list
  • reduce:对RDD内容进行自定义聚合
  • take:取出RDD的前N个元素组成list
  • count:统计RDD元素个数

数据输出可用的方法是很多的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值