pyspark实践

1。pyspark是什么

PySpark 是 Apache Spark 的官方 Python 接口,它使得 Python 开发者能够访问 Spark 的核心功能,如:

  • Spark SQL :用于执行 SQL 查询以及读取数据的库,支持多种数据格式和存储系统。py.qizhen.xyz

  • DataFrame API :提供了一个分布式数据集合,使得数据处理和分析更加直观和高效。py.qizhen.xyz+1CSDN 博客+1

  • MLlib :用于进行机器学习的库。py.qizhen.xyz+1维基百科+1

  • GraphX :用于图形处理的库(在 PySpark 中通过第三方库如 GraphFrames 访问)。py.qizhen.xyz

  • Spark Streaming :用于实时数据流处理的库。py.qizhen.xyz

通过 PySpark,Python 开发者可以方便地进行大规模数据分析和数据挖掘工作,而无需深入了解分布式计算的复杂性。

2.实战

复制代码
创建和管理 Spark 会话所需的类

from pyspark.sql import SparkSession

import pyspark.sql.functions as F
#从 pyspark.sql.functions 模块中导入所有函数,并将其简写为 F
from pyspark.sql.types import *
#从 pyspark.sql.types 模块中导入所有的数据类型类。

from pyspark.sql.functions import udf
#使用 PySpark 创建和注册用户定义函数的第一步,允许将自定义的 Python 函数应用于 Spark 的数据处理流程中

spark = SparkSession.builder.appName('data_processing').getOrCreate()
#创建或获取一个 SparkSession 实例

schema = StructType().add('user_id',"string").add("country","string").add("browser","string").add("OS","string").add("age","integer")
#创建的 DataFrame 将具有预定义的列名和数据类型,有助于确保数据一致性和便于后续的数据处理操作

df_custom = spark.createDataFrame([("A203",'India',"Chrome","WIN",33),("A201",'China',"Safari","MacOS",35),("A205",'UK',"Mozilla","Linux",25)],schema = schema)
#这行代码使用 PySpark 创建了一个带有指定模式(schema)的 DataFrame。

df_custom.printSchema()
#用于以可读的层次结构格式展示 DataFrame 的结构信息。
复制代码
df_custom.show()
#将 DataFrame 的前几行数据显示在控制台上
复制代码
df_na=spark.createDataFrame([("A203",None,"Chrome","WIN",33),("A201",'China',None,"MacOS",35),("A205",'UK',"Mozilla","Linux",25)],schema=schema)
#使用指定的模式(schema)创建一个包含部分缺失值(None)的 DataFrame。
复制代码
df_na.fillna('0').show()
#将 DataFrame df_na 中所有列的缺失值(null 或 None)替换为字符串 '0',然后以表格形式在控制台上显示前 20 行数据
复制代码
df_na.fillna({'country':'USA','browser':'Google Chrome'}).show()
#使用 fillna() 方法,将 DataFrame df_na 中 country 列的缺失值替换为 'USA',browser 列的缺失值替换为 'Google Chrome'
复制代码
df_na.na.drop().show()
#删除包含缺失值的行:df_na.na.drop() 会从 DataFrame df_na 中删除任何包含 null(或 None)值的行。默认情况下,drop() 方法会移除任何列中存在缺失值的行。

df_na.na.drop(subset='country').show()
#删除特定列中包含缺失值的行:df_na.na.drop(subset='country') 会从 DataFrame df_na 中删除 country 列中包含 null 或 None 值的行。

对csv文件进行处理

复制代码
df = spark.read.csv("customer_data.csv",header = True, inferSchema=True)
#读取名为 customer_data.csv 的 CSV 文件,并将其加载为 DataFrame

df.count()
查看数量

len(df.columns)
#查看列数

df.columns
#查看列名

df.filter(df['Avg_Salary']>500000).filter(df['Number_of_houses']>2).show()
#筛选

df.where((df['Avg_Salary']>500000)&(df['Number_of_houses']>2)).show()
#where() 是 PySpark DataFrame 的方法,用于根据指定的条件筛选行。它是 filter() 方法的别名,两者功能相同

df.groupBy('Customer_subtype').count().show()
#按客户子类型分组并统计每组数量的常用方法,有助于了解不同客户子类型的分布情况。

for col in df.columns:
    if col!='Avg_Salary':
        print(f" Aggregation for {col}")
        df.groupBy(col).count().orderBy('count',ascending=False).show(truncate=False)
#对 DataFrame df 中除 'Avg_Salary' 列以外的每一列进行分组计数,并按计数降序显示结果。

df.groupBy('Customer_main_type').agg(F.mean('Avg_Salary')).show()
#对 DataFrame df 按照 Customer_main_type 列进行分组,并计算每个主类型的平均薪资:

df.groupBy('Customer_main_type').agg(F.max('Avg_Salary')).orderBy('max(Avg_Salary)',ascending=False).show()
#用于对 DataFrame df 按照 Customer_main_type 列进行分组,并计算每个主类型的最高平均薪资,然后按降序排列结果

df.groupBy('Customer_subtype').agg(F.max('Avg_Salary').alias('max_salary')).orderBy('max_salary',ascending=False).show()
#在 PySpark 中,以下代码用于对 DataFrame df 按照 Customer_subtype 列进行分组,并计算每个子类型的最高平均薪资,然后按降序排列结果

df.groupBy("Customer_subtype").agg(F.collect_set("Number_of_houses")).show() 
#是在 PySpark 中用于按客户子类型分组并收集每组房屋数量的唯一值的常用方法,有助于了解不同客户子类型的房屋数量分布情况。
1. 初始化与数据创建
  • 使用 SparkSession.builder.getOrCreate() 初始化 Spark 环境。

  • 使用 StructType 明确定义 schema。

  • spark.createDataFrame() 构造了两个 DataFrame(一个有缺失值)。

2. DataFrame 基本操作
  • .printSchema():打印 schema 信息。

  • .show():展示数据内容。

  • .fillna():填充缺失值。

  • .na.drop() / .na.drop(subset=...):删除缺失值行。

  • .replace():替换字段值。

  • .drop():删除某一列。

3. CSV 文件读取
  • spark.read.csv(..., header=True, inferSchema=True) 读取并自动推断数据类型。
4. 基础探索与过滤
  • .count() / len(df.columns) / df.columns:了解数据结构。

  • .summary().show():生成描述性统计。

  • .filter() / .where():条件筛选数据。

  • .select():选择列。

5. 分组与聚合操作
  • .groupBy(...).count():分组计数。

  • .groupBy(...).agg(F.mean(...)):分组平均值。

  • .groupBy(...).agg(F.max(...)):分组最大值。

  • .agg(F.collect_set(...)):收集唯一值列表。

  • .orderBy(...):排序显示。

6. 列操作
  • .withColumn("new_col", F.lit(...)):添加常量列。

  • .withColumn("new_col", udf(col)):使用自定义 UDF 添加新列。

7. UDF / Pandas UDF
  • 使用标准 udf() 创建 age 分类函数。

  • 使用 pandas_udf() 实现归一化薪资计算(注释掉了实际调用)。

相关推荐
敏姐的后花园33 分钟前
python完成批量复制Excel文件并根据另一个Excel文件中的名称重命名
开发语言·python·excel
LeeZhao@37 分钟前
【数据分析】特征工程-特征选择
python·机器学习·数据分析
巴塞罗那的风1 小时前
如何手搓一个查询天气的mcp server
python·mcp·roo code
晨曦5432101 小时前
GUI 编程——python
开发语言·python
五碗火锅1 小时前
【pycharm】如何连接远程仓库进行版本管理(应用版本)
ide·git·python·pycharm
go54631584651 小时前
基于Python的自动化视频编辑脚本设计,能够处理视频剪辑、添加字幕、文本动画、音效和图形等功能
python·自动化·音视频
程序员的世界你不懂2 小时前
Appium+python自动化(七)- 认识Appium- 上
python·appium·自动化
cxf_coding2 小时前
如何使用HiveSQL实现2个字符串间的映射及排序
大数据·hive
黑不拉几的小白兔3 小时前
第十五届蓝桥杯大赛软件赛国赛Python 大学 C 组试做【本期题单: 设置密码、栈】
c语言·python·蓝桥杯
ZHPEN13 小时前
python打卡day38
python