PySpark EDA 完整案例介紹,附代碼(三)

本篇文章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…