本篇文章Why Most Data Scientists Are Wrong About PySpark EDA — And How to Do It Right适合希望高效处理大数据的从业者。文章的亮点在于强调了使用PySpark进行探索性数据分析(EDA)的重要性,避免了将Spark数据框转换为Pandas的低效做法。几点建议:

  • 留在 Spark 中:不要强行将 Pandas 引入大数据工作流。
  • 明智地使用采样:Spark 完成繁重的工作,你绘制小样本。
  • 分布式思考:将过滤、连接和聚合推送到 Spark 中。

关联Pyspark文章:

  • 90% 的机器学习团队仍停留在 2019 年的建模方式: Spark+XGBoost大规模训练
  • 在 PySpark ML 中LightGBM比XGBoost更好(二)
  • 在 PySpark 中解锁窗口函数的力量,实现高级数据转换
  • (早年帖子) PySpark︱DataFrame操作指南:增/删/改/查/合并/统计与数据处理
  • (早年帖子) pySpark | pySpark.Dataframe使用的坑 与 经历
  • (早年帖子) PySpark︱pyspark.ml 相关模型实践

文章目录

  • 1 为什么在 PySpark 中进行 EDA 是不同的(并且更适合大数据)
  • 2 步骤 1 — 从免费数据集开始
  • 3 步骤 2 — 大规模数据分析
    • 3.1 摘要统计
    • 3.2 缺失值
    • 3.3 唯一值(基数)
  • 4 步骤 3 — 分布与可视化
    • 4.1 示例:行程距离分布
    • 4.2 示例 2:按乘客数量划分的平均票价(条形图)
    • 4.3 分类分布
  • 5 步骤 4 — 相关性与关系
    • 5.1 相关矩阵
    • 5.2 示例 3:相关性热力图(距离、票价、小费)
    • 5.3 分组洞察
  • 6 步骤 5 — 使用 Spark SQL 进行高级 EDA
  • 7 常见错误(以及如何避免)
  • 8 PySpark EDA 的未来


如果你是一名数据科学家、AI/ML 从业者或数据分析专业人士,你可能经历过这样的噩梦:你获得了海量数据集,渴望对其进行探索,然后……你基于 Pandas 的笔记本就卡死了。

大多数人错误地认为:探索性数据分析 (EDA) 是一种Pandas + Seaborn 的仪式。这种信念如此普遍,以至于整个团队浪费数小时将 Spark DataFrames 转换为 Pandas——结果却遇到了内存错误。

在这篇文章中,我将向你展示如何在 PySpark 中构建一个完整、端到端的 EDA 工作流。无需 Pandas 转换。无需“对所有数据进行降采样”的借口。只有干净、可扩展的技术。

这基于我自己在领导数亿行数据分析项目中的经验,在这些项目中,Pandas 不仅效率低下——它根本不可能使用。

读完本文,你将知道如何:

  • 直接在 Spark 中分析海量数据集
  • 使用 Spark SQL 和 PySpark 函数进行统计摘要
  • 生成可视化而不会耗尽内存
  • 为实际项目构建一个可重复、可扩展的 EDA 流水线

1 为什么在 PySpark 中进行 EDA 是不同的(并且更适合大数据)

当你在 Pandas 中打开数据集时,所有数据都会加载到内存中。如果你正在分析一个包含 50 万行数据的 CSV 文件,这没问题。但如果将其扩展到5 亿行,你的笔记本电脑就会直接罢工。

我仍然记得我在金融领域的第一个大型项目:我们有数十亿条交易记录。我天真地以为我“只需使用 Pandas 进行采样”。我的笔记本在不到一分钟内就卡死了。更糟糕的是:即使我设法获得了一个样本,我意识到它不够具代表性——分布具有误导性。

这时 Spark 进入了视野。与 Pandas 不同,Spark 不会在你要求它处理数据之前进行处理。它是惰性的、分布式的,并且旨在处理数 TB 的数据而不会崩溃。

让我们比较一下:

Pandas

  • 在单台机器上运行
  • 所有数据都在内存中
  • 非常适合中小型数据集

PySpark

  • 分布在多个节点上
  • 惰性求值——只在需要时处理
  • 专为海量数据集构建

然而,许多教程仍然告诉你:“将你的 Spark DataFrame 转换为 Pandas,然后用 Matplotlib 绘图。”这不仅是糟糕的建议——它很危险。你正在丢弃 Spark 为之构建的可扩展性。

👉 要点:如果你的数据集已经存在于 Spark 中,你的 EDA 也应该留在 Spark 中。

2 步骤 1 — 从免费数据集开始

你不需要公司权限来练习 Spark EDA。有大量免费的真实世界数据集。我最喜欢的是:

  • 纽约市出租车行程数据(数亿次乘车):NYC Open Data
  • Airbnb 房源数据:Inside Airbnb
  • MovieLens(电影评分和元数据):MovieLens

对于本指南,让我们使用 NYC 出租车行程数据集。它足够大,符合实际,并且文档完善。

from pyspark.sql import SparkSessionspark = SparkSession.builder.appName("EDA_PySpark").getOrCreate()df = spark.read.csv("yellow_tripdata_2023-01.csv", header=True, inferSchema=True)
df.printSchema()
df.show(5)

输出:

root|-- VendorID: integer (nullable = true)|-- tpep_pickup_datetime: timestamp (nullable = true)|-- tpep_dropoff_datetime: timestamp (nullable = true)|-- passenger_count: integer (nullable = true)|-- trip_distance: double (nullable = true)|-- fare_amount: double (nullable = true)|-- tip_amount: double (nullable = true)

👉 专业提示inferSchema=True 对于探索很方便。但在生产环境中,手动定义模式——当 Spark 预先知道列类型时,运行速度会快得多。

3 步骤 2 — 大规模数据分析

EDA 的第一步是分析:了解数据集的形状、完整性和特性。

3.1 摘要统计

df.describe().show()

这会计算数值列的计数、均值、标准差、最小值和最大值——并在集群中分布式执行。

3.2 缺失值

Pandas 用户通常会写 df.isnull().sum()。在 Spark 中,你可以这样复制它:

from pyspark.sql.functions import col, sumdf.select([sum(col(c).isNull().cast("int")).alias(c) for c in df.columns]).show()

这会告诉你每列有多少个空值。

3.3 唯一值(基数)

for c in ["passenger_count", "VendorID"]:print(c, df.select(c).distinct().count())

高基数通常表示类似 ID 的字段(不利于建模)。低基数?是分组的好选择。

👉 提示.distinct() 可能会很昂贵。如果你只需要一个估计值,请使用 .approx_count_distinct()

4 步骤 3 — 分布与可视化

这就是有趣的地方。大多数人认为:“你不能直接在 Spark 中进行可视化。”这不正确。

诀窍在于智能采样。Spark 拥有完整的数据集,但你只提取绘图所需的数据。

4.1 示例:行程距离分布

import matplotlib.pyplot as pltsample = df.select("trip_distance").sample(fraction=0.01).toPandas()plt.hist(sample["trip_distance"], bins=50, range=(0,20))
plt.title("Trip Distance Distribution")
plt.xlabel("Distance (miles)")
plt.ylabel("Frequency")
plt.show()


行程距离直方图

你不需要加载所有 1000 万行,只需提取 1%。这足以生成一个具有代表性的直方图。

👉 专业提示:在绘图前始终过滤掉不切实际的异常值。在出租车数据中,200 英里的行程很可能是数据录入错误。

4.2 示例 2:按乘客数量划分的平均票价(条形图)

我们可以使用 Spark 进行聚合,然后绘制结果。

import pandas as pdavg_fares = (df.groupBy("passenger_count").avg("fare_amount").orderBy("passenger_count").toPandas()
)
plt.figure(figsize=(8,6))
plt.bar(avg_fares["passenger_count"], avg_fares["avg(fare_amount)"], color="orange")
plt.title("Average Fare by Passenger Count")
plt.xlabel("Passenger Count")
plt.ylabel("Average Fare ($)")
plt.show()


按乘客数量划分的平均票价(条形图)

👉 这显示了更大的团体是否倾向于支付更多费用。在纽约市出租车中,单人乘车占主导地位,但票价确实会随着团体人数的增加而略有上涨。

4.3 分类分布

df.groupBy("passenger_count").count().orderBy("passenger_count").show()

这一行代码就能告诉你有多少次行程有 1、2、3……位乘客。

5 步骤 4 — 相关性与关系

EDA 不仅仅是单变量分析——你还需要了解变量之间的关系。

5.1 相关矩阵

from pyspark.ml.stat import Correlation
from pyspark.ml.feature import VectorAssemblercols = ["trip_distance", "fare_amount", "tip_amount"]
vec = VectorAssembler(inputCols=cols, outputCol="features").transform(df)corr = Correlation.corr(vec, "features").head()[0]
print(corr.toArray())

输出(截断):

[[ 1.0, 0.78, 0.32],[0.78, 1.0, 0.55],[0.32, 0.55, 1.0]]

👉 解释:票价和行程距离强相关(合情合理)。小费金额与两者都有中等相关性。

5.2 示例 3:相关性热力图(距离、票价、小费)

import seaborn as sns
from pyspark.ml.stat import Correlation
from pyspark.ml.feature import VectorAssemblercols = ["trip_distance", "fare_amount", "tip_amount"]
vec = VectorAssembler(inputCols=cols, outputCol="features").transform(df)corr_matrix = Correlation.corr(vec, "features").head()[0].toArray()import pandas as pd
corr_df = pd.DataFrame(corr_matrix, index=cols, columns=cols)plt.figure(figsize=(8,6))
sns.heatmap(corr_df, annot=True, cmap="coolwarm", fmt=".2f")
plt.title("Correlation Heatmap")
plt.show()


相关性热力图

👉 现在你得到了一个漂亮的相关性热力图,显示行程距离和票价强相关,而小费金额与它们的关系较弱但呈正相关。

5.3 分组洞察

df.groupBy("passenger_count").avg("fare_amount", "tip_amount").show()

这能快速显示小费如何随团体人数变化。

6 步骤 5 — 使用 Spark SQL 进行高级 EDA

有时,SQL 是最快的思考方式。Spark 允许你无缝切换。

df.createOrReplaceTempView("trips")spark.sql("""
SELECT passenger_count,AVG(fare_amount) AS avg_fare,AVG(tip_amount) AS avg_tip
FROM trips
WHERE trip_distance BETWEEN 1 AND 20
GROUP BY passenger_count
ORDER BY passenger_count
""").show()

该查询:

  • 过滤掉极端异常值
  • 按乘客数量分组
  • 给出平均票价和小费

结果:清晰、可解释的 EDA 洞察。

7 常见错误(以及如何避免)

  1. 将整个 DataFrames 转换为 Pandas

    • 💥 内存立即崩溃。
    • ✅ 解决方案:使用 .sample().limit() 进行采样。
  2. 忘记 Spark 是惰性的

    • “为什么我的代码没有运行?”因为 Spark 等待一个_动作_。
    • ✅ 解决方案:使用 .show().count().collect() 来触发执行。
  3. 使用大型 .collect() 使本地机器过载

    • ✅ 在将结果带到本地内存之前,始终在 Spark 中进行聚合。
  4. 不智能地进行缓存

    • 如果你反复重用同一个子集,请对其进行 .cache() 以避免重复计算。

👉 经验法则:将 Spark 视为你的计算引擎,而不仅仅是数据容器。

8 PySpark EDA 的未来

我们正处于一个激动人心的转折点。

  • Spark 上的 Pandas API (Koalas):为 Spark DataFrames 带来了类似 Pandas 的语法。
  • 自动化 EDA 工具,如 ydata-profiling,正在适应 Spark。
  • 可视化库(Plotly、Altair)正在构建直接的 Spark 连接器。
  • LLMs + Spark:想象一下,输入“显示一月份行程中的异常”,然后立即获得 SQL 和图表。这已经不远了。

👉 EDA 的未来是可扩展、自动化和对话式的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/96088.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96088.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/96088.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode18(无重复字符的最长子串)

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。示例 1:输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。思路:对于长度为0的数组单独处理其他数组最小的可能…

计算机毕设 java 高校家教平台 基于 SSM 框架的高校家教服务平台 Java+MySQL 的家教预约与课程管理系统

计算机毕设java高校家教平台75snd9 (配套有源码 程序 mysql数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联xi 可分享在高校家教需求增长的背景下,传统家教对接依赖线下中介、信息分散,存在沟通成本高、课…

【自记】Python 的 SQLAlchemy 完整实践教程

目录 SQLAlchemy 介绍环境准备与安装数据库连接数据模型定义基本数据操作复杂查询操作高级特性实战项目示例性能优化与最佳实践常见问题与解决方案 1. SQLAlchemy 介绍 1.1 什么是SQLAlchemy SQLAlchemy 是一个用于 Python 的 SQL 工具和对象关系映射(ORM&#x…

springboot rabbitmq 延时队列消息确认收货订单已完成

供应商后台-点击发货-默认3天自动收货确认&#xff0c;更新订单状态已完成。1 pom.xml 引入依赖&#xff1a;<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>2 …

Linux内核TCP输出引擎:深入解析数据传输的核心机制

引言 传输控制协议(TCP)作为互联网最重要的基础协议之一,其实现质量直接关系到网络性能和应用体验。在Linux内核中,TCP协议的输出引擎是实现可靠数据传输的核心组件,负责将应用层数据高效、可靠地传输到网络对端。本文将深入分析Linux内核中TCP输出引擎的关键机制和实现原…

数据仓库详解

数据仓库详解第一节 数据仓库构建方法论和实践一、数据仓库与数据库的区别二、数据仓库对于企业的价值三、数据仓库的模型构建1、数据仓库构建需要考虑的问题2、什么是数仓的数据模型3、如何构建数仓的数据模型&#xff08;1&#xff09;概念模型设计&#xff08;2&#xff09;…

单身杯1(web)

web签到<?php# -*- coding: utf-8 -*- # Author: h1xa # Date: 2022-03-19 12:10:55 # Last Modified by: h1xa # Last Modified time: 2022-03-19 13:27:18 # email: h1xactfer.com # link: https://ctfer.comerror_reporting(0); highlight_file(__FILE__);$file $_…

RNN/LSTM/GRU/Transformer

RNN的局限1&#xff1a;长期依赖&#xff08;Long-TermDependencies&#xff09;问题但是同样会有一些更加复杂的场景。比如我们试着去预测“I grew up in France...I speak fluent French”最后的词“French”。当前的信息建议下一个词可能是一种语言的名字&#xff0c;但是如…

浏览器开发CEFSharp+X86 (十六)网页读取电子秤数据——仙盟创梦IDE

一、东方仙盟智能浏览器&#xff1a;跨平台&#xff0c;畅连百种硬件&#xff0c;速启现场编译东方仙盟 VOS 智能浏览器在网页调用硬件 SDK 领域堪称卓越典范。它全面兼容多平台&#xff0c;无论是电脑、手机还是各类移动终端&#xff0c;都能完美适配&#xff0c;无缝对接。令…

腾讯云EdgeOne免费套餐:零成本开启网站加速与安全防护

腾讯云EdgeOne免费套餐&#xff1a;零成本开启网站加速与安全防护 ​一键解锁全球3200节点&#xff0c;让网站速度提升53%&#xff0c;同时获得企业级安全防护作为一名站长或个人开发者&#xff0c;你是否曾为网站加载速度缓慢而苦恼&#xff1f;是否担心网站遭遇DDoS攻击或恶意…

服务器数据恢复—Raid6阵列崩溃导致上层分区无法访问的数据恢复案例

服务器存储数据恢复环境&#xff1a; 一台infortrend某型号存储&#xff0c;存储设备上有12块硬盘&#xff0c;组建一组raid6磁盘阵列。阵列上层有一个lun&#xff0c;映射到WINDOWS系统上使用。WINDOWS系统划分了一个GUID Partition Table分区。服务器存储故障&#xff1a; 存…

【生产故事会】Kafka 生产环境参数优化实战案例

Kafka 3.9.1 生产环境参数优化实战案例(8核32G HDD场景) 一、背景与硬件/业务配置 某企业级全链路日志采集平台需构建高稳定Kafka集群,承担核心业务日志流转(涵盖用户行为、系统监控、交易链路日志),单集群3节点部署,硬件与业务特征如下: 维度 具体配置 硬件配置 C…

推荐 Eclipse Temurin 的 OpenJDK

推荐 Eclipse Temurin 的 OpenJDK 发行版 https://adoptium.net/zh-CN/temurin/releases&#xff0c;是基于其在技术可靠性、生态中立性、许可友好性和社区支持等多个维度的综合优势。 以下是详细的原因&#xff0c;解释了为什么 Eclipse Temurin 通常是基于 OpenJDK 构建的 J…

分布式3PC理论

目录 为什么需要 3PC&#xff1f; 核心结论 3PC的优缺点 3PC与 Paxos / Raft 对比 本篇文章内容的前置知识为 分布式2PC理论&#xff0c;如果不了解&#xff0c;可点击链接学习 分布式2PC理论-CSDN博客 为什么需要 3PC&#xff1f; 1) 2PC 的根本问题&#xff1a;阻塞 不…

Web 前端可视化开发工具对比 低代码平台、可视化搭建工具、前端可视化编辑器与在线可视化开发环境的实战分析

在前端开发领域&#xff0c;“可视化”已经成为提升效率和降低门槛的重要方向。从 低代码平台 到 前端可视化编辑器&#xff0c;再到 在线可视化开发环境&#xff0c;这些工具都在改变前端的开发方式。 本文将结合真实项目&#xff0c;分析常见的 Web 前端可视化开发工具&#…

单例模式(C++)(错误日志实现)

单例模式一、核心原理二、常见的单例模式实现方式1. 懒汉式&#xff08;Lazy Initialization&#xff09;2. 饿汉式&#xff08;Eager Initialization&#xff09;三、关键实现细节解析四、单例模式的适用场景与特点使用场景日志工具&#xff08;确保日志写入的唯一性&#xff…

stm32 链接脚本没有 .gcc_except_table 段也能支持 C++ 异常

stm32 使用 cubemx 生成的 gnu ld 链接脚本没有 .gcc_except_table 段。如下所示 /* ****************************************************************************** ** ** file : LinkerScript.ld ** ** author : Auto-generated by STM32CubeIDE ** ** Abst…

SpringBoot改造MCP服务器(StreamableHTTP)

项目地址&#xff1a; https://gitee.com/kylewka/smart-ai 1 项目说明 MCP&#xff08;Model Context Protocol&#xff09;协议是一个用于 AI 模型和工具之间通信的标准协议。随着 AI 应用变得越来越复杂并被广泛部署&#xff0c;原有的通信机制面临着一系列挑战。 近期 MCP …

【数学建模】烟幕干扰弹投放策略优化:模型与算法整合框架

烟幕干扰弹投放策略优化&#xff1a;模型与算法整合框架 基于文献研究和问题需求分析&#xff0c;我们构建了完整的模型与算法整合框架。 一、整体建模框架 1. 核心问题分解 物理层&#xff1a;烟幕弹道运动与扩散特性建模博弈层&#xff1a;导弹识别与决策机制建模优化层&…

结合大数据知识体系对仓库建模方法总结

传统的仓库建模理论&#xff08;如维度建模&#xff09;仍然是基石&#xff0c;但大数据的“4V”特性&#xff08;Volume, Velocity, Variety, Value&#xff09;要求我们对这些方法进行演进和补充。 以下是结合大数据知识体系对仓库建模方法的总结&#xff1a;一、核心目标&am…