Pyspark 数据计算

本文介绍了Spark中的map,flatMap,reduceByKey,filter和distinct操作,包括它们的功能、示例和使用场景。通过实例展示了如何在Spark中处理和转换数据,如元素映射、键值对聚合和数据筛选等。

目录

map方法

flatMap 方法

reduceByKey方法

filter 算子

 distinct 算子


map方法

简单来说:是对rdd里每个元素进行操作

# 导包
from pyspark import SparkConf, SparkContext
#Caused by: org.apache.spark.SparkException: Python worker failed to connect back.
# 就是代码没有准确的找到python解释器
import os
os.environ["PYSPARK_PYTHON"] = "D:/APP/Anaconda/envs/teat1/python.exe"

# 创建SparkConf 类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
# 拿到执行环境入口对象
sc = SparkContext(conf=conf)

# 通过parallelize 方法将python对象加载到spark内,成为RDD对象
rdd = sc.parallelize([1, 2, 3, 4, 5]) # 列表
# 通过map方法将全部数据都乘以十,再加5

def func(data):
    return data * 10

rdd2 = rdd.map(func).map(lambda x: x+5)
 # (T) -> U  含义就是要传的这个函数要满足接受一个参数的传入,能够返回一个返回值
print(rdd2.collect())
# 运行结果 [15, 25, 35, 45, 55]



flatMap 方法

 简单来说:和map方法差不多,就是比map方法多一个解除嵌套操作

 

reduceByKey方法

 功能:针对KV型RDD(二元元组,一个元组里只有两个元素 ('a', 1) ('b',1)),自动按着key 分组,然后根据你提供的聚合逻辑(加,减...),完成组内数据(value) 的聚合操作

# 导包
from pyspark import SparkConf, SparkContext
#Caused by: org.apache.spark.SparkException: Python worker failed to connect back.
# 就是代码没有准确的找到python解释器
import os
os.environ["PYSPARK_PYTHON"] = "D:/APP/Anaconda/envs/teat1/python.exe"

# 创建SparkConf 类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
# 拿到执行环境入口对象
sc = SparkContext(conf=conf)

# 通过parallelize 方法将python对象加载到spark内,成为RDD对象
rdd = sc.parallelize([('男',99), ('男',88), ('女',94), ('女',93)]) # 列表
# 通过map方法将全部数据都乘以十,再加5


rdd2 = rdd.reduceByKey(lambda a,b:a+b)
 # (T) -> U  含义就是要传的这个函数要满足接受一个参数的传入,能够返回一个返回值
print(rdd2.collect())
#[('女', 187), ('男', 187)]



filter 算子

# 导包
from pyspark import SparkConf, SparkContext
#Caused by: org.apache.spark.SparkException: Python worker failed to connect back.
# 就是代码没有准确的找到python解释器
import os
os.environ["PYSPARK_PYTHON"] = "D:/APP/Anaconda/envs/teat1/python.exe"

# 创建SparkConf 类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
# 拿到执行环境入口对象
sc = SparkContext(conf=conf)

# 通过parallelize 方法将python对象加载到spark内,成为RDD对象
rdd = sc.parallelize([1, 2, 3, 4, 5]) # 列表
# 通过 filter 对RDD进行过滤,偶数被保留
rdd2 = rdd.filter(lambda num: num%2 == 0)
 # (T) -> U  含义就是要传的这个函数要满足接受一个参数的传入,能够返回一个返回值
print(rdd2.collect())
#[2, 4]

 distinct 算子

# 导包
from pyspark import SparkConf, SparkContext
#Caused by: org.apache.spark.SparkException: Python worker failed to connect back.
# 就是代码没有准确的找到python解释器
import os
os.environ["PYSPARK_PYTHON"] = "D:/APP/Anaconda/envs/teat1/python.exe"

# 创建SparkConf 类对象
conf = SparkConf().setMaster("local[*]").setAppName("test_spark")
# 拿到执行环境入口对象
sc = SparkContext(conf=conf)

# 通过parallelize 方法将python对象加载到spark内,成为RDD对象
rdd = sc.parallelize([1, 2, 2, 2, 5]) # 列表
# 通过 filter 对RDD进行过滤,偶数被保留
rdd2 = rdd.distinct()
 # (T) -> U  含义就是要传的这个函数要满足接受一个参数的传入,能够返回一个返回值
print(rdd2.collect())
#[1, 2, 5]



sortBy算子 

 

 

### 使用PySpark进行实时计算的方法 #### 1. PySpark Streaming简介 PySpark Streaming 是 Apache Spark 的扩展模块之一,专门用于处理大规模的流式数据。它可以接收来自不同来源的数据(如 Kafka、Flume 和 HDFS),并对其进行实时分析和转换[^4]。 以下是基于 PySpark Streaming 进行实时计算的核心概念: - **DStream (Discretized Stream)**:这是 Spark Streaming 中的基本抽象,表示连续不断的数据流。 - 数据源可以是文件系统、套接字连接或消息队列服务(如 Kafka)。 #### 2. 示例代码:使用Kafka作为数据源的实时计算 下面是一个简单的例子,展示如何使用 PySpark Streaming 来消费 Kafka 主题中的数据,并统计每批次单词的数量: ```python from pyspark import SparkConf, SparkContext from pyspark.streaming import StreamingContext from pyspark.streaming.kafka import KafkaUtils # 配置 Spark 环境 conf = SparkConf().setMaster("local[2]").setAppName("KafkaWordCount") sc = SparkContext.getOrCreate(conf=conf) ssc = StreamingContext(sc, batchDuration=2) # 批次间隔为2秒 # 定义 Kafka 参数 kafka_params = {"metadata.broker.list": "localhost:9092"} topics = ["test_topic"] # 创建 DStream kvs = KafkaUtils.createDirectStream(ssc, topics, kafkaParams=kafka_params) lines = kvs.map(lambda x: x[1]) # 提取消息内容 words = lines.flatMap(lambda line: line.split(" ")) word_counts = words.countByValue() # 输出结果到控制台 word_counts.pprint() ssc.start() ssc.awaitTermination() ``` 上述代码展示了如何设置一个基本的 Spark 流程来读取 Kafka 消息,并对这些消息的内容按词频计数[^5]。 #### 3. 结合 Structured Streaming 处理更复杂的场景 Structured Streaming 是 Spark 2.x 版本引入的新特性,旨在简化流式数据分析的任务。相比于传统的 RDD 基础上的 Streaming API,Structured Streaming 更加易用且性能更高。 ##### 示例代码:使用 Structured Streaming 统计窗口内的事件数量 假设我们有一个日志文件源源不断地写入某个目录下,希望每隔一段时间统计一次最近几分钟的日志条目总数。 ```python from pyspark.sql import SparkSession from pyspark.sql.functions import window, col # 初始化 Spark Session spark = SparkSession.builder \ .appName("StructuredStreamingExample") \ .getOrCreate() # 设置检查点路径 spark.sparkContext.setLogLevel("ERROR") # 从文件中读取流式数据 lines_df = spark.readStream.text("/path/to/log/files/") # 将每一行拆分为多个字段(这里简单起见只保留整行) events_df = lines_df.selectExpr("value as event").withColumn("timestamp", current_timestamp()) # 应用滑动窗口聚合操作 windowedCounts = events_df.groupBy( window(col("timestamp"), "1 minute", "30 seconds"), ).count() query = windowedCounts.writeStream \ .outputMode("complete") \ .format("console") \ .start() query.awaitTermination() ``` 此脚本会持续监控指定目录下的新文件,并以固定的时间窗长度报告记录数目变化情况。 --- ### 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值