PySpark DataFrame教程與演示

banq發表於2024-03-08

PySpark DataFrame 是 PySpark 庫中的基本抽象,專為分配的記錄處理和操作而設計。它是 Apache Spark 生態系統的重要組成部分,提供了一種強大且綠色的方式來大規模處理結構化資訊。

PySpark DataFrame 建立在 Spark 彈性分散式資料集 (RDD) 模型的功能之上,並將其擴充套件為提供更好程度的表格記錄形狀,就像 SQL 表或 Pandas DataFrame 一樣。


PySpark DataFrame 的優點:

  1. 分散式處理: PySpark DataFrame 基於 Apache Spark 構建,可實現跨機器叢集的分散式處理。這導致大規模統計處理任務的整體效能大幅提升。
  2. 易於使用: DataFrame API 是使用者友好的,並提供了一個熟悉的類似 SQL 的介面來進行統計操作。這使得面向 SQL 和程式設計的使用者都可以使用它。
  3. 並行處理: DataFrame 允許並行處理統計資料,利用叢集的總體功能。這加快了資訊評估並減少了處理時間。
  4. 延遲評估:與其他 Spark 新增劑一樣,PySpark DataFrame 操作是延遲評估的,這使得 Spark 在實際計算之前最佳化執行計劃。這可以帶來更高的效能和資源利用率。
  5. 最佳化: PySpark DataFrame 由一個 Catalyst 最佳化器組成,用於最佳化查詢執行計劃。這種最佳化可以透過最小化統計資料混洗和減少不必要的計算來實現高效的問題處理。
  6. 架構和型別安全: PySpark DataFrame 具有架構,可確保記錄遵循所描述的形狀。這增加了一層資訊驗證和型別保護。
  7. 整合: PySpark DataFrame 與不同的 Spark 新增劑以及 Spark SQL、MLlib 和 Spark Streaming 無縫整合,為各種事實處理任務提供了一個全面的平臺。


PySpark DataFrame 的缺點:

  1. 記憶體開銷:由於額外的後設資料和最佳化系統,DataFrame 引入了一些記憶體開銷。這可能會影響極小資料集的記憶體利用率。
  2. 學習曲線:雖然 DataFrame API 的設計初衷是讓使用者感到愉悅,但仍然存在一個熟悉曲線,特別是對於剛接觸分散計算理念的使用者而言。
  3. 表達能力有限:雖然 DataFrame API 很靈活,但它可能無法涵蓋透過減少階段 RDD 更改執行的所有操作。在某些情況下,客戶可能希望恢復到 RDD 來進行獨特的自定義操作。
  4. 序列化開銷: DataFrame 操作包含統計資訊的序列化和反序列化,這會增加開銷,特別是對於一流粒度的操作。
  5. 除錯挑戰:與單機答案相比,除錯分配的結構可能更加困難。識別複雜差異和最佳化中出現的問題可能需要額外的專業知識。
  6. 設定的複雜性:設定 Spark 叢集和配置資源可能比使用單個小工具解決方案更復雜。在處理更大的叢集時,這種複雜性會增加。

案例:PySpark DataFrame 中將單列拆分為多列
考慮這樣一種情況,您有一個 DataFrame,其中有一列包含需要分解為單獨列的值。當處理具有儲存在單一主題中的複合值的資料時,這很
常見,包括完整的呼叫或具有 12 個月、月份和日期附加值的日期。

在本教程中,我們將介紹使用 PySpark 將單個列拆分為多個列的技術。

為了將單列分割成多列,PySpark 提供了許多整合功能,其中 cut up() 是最常用的功能。split ()特徵採用兩個引數:要分割的列和分隔值的分隔符。

以下是有關如何將 PySpark DataFrame 中的單列拆分為多個列的分步手冊:

from pyspark.sql import SparkSession  
from pyspark.sql.functions import split  

建立 SparkSession:

spark = SparkSession.builder.appName(<font>"SplitColumnExample").getOrCreate()  

建立 DataFrame:
假設您有一個名為 df 的 DataFrame,其中有一列名為 "全名"。我們將把這一列分成 "名 "和 "姓 "兩列。

data = [('John Doe',),  
        ('Jane Smith',),  
        ('Michael Johnson',)]  
  
columns = ['Full Name']  
  
df = spark.createDataFrame(data, columns)  


使用 split() 函式
現在,允許我們將 "全名 "列拆分成 "名 "和 "姓 "列,並使用 "split() "功能。

split_col = split(df['Full Name'], ' ')  
df = df.withColumn('First Name', split_col.getItem(0))  
df = df.withColumn('Last Name', split_col.getItem(1))  

整個程式碼:

# Importing required modules  
from pyspark.sql import SparkSession  
from pyspark.sql.functions import split  
  
# Creating a SparkSession  
spark = SparkSession.builder.appName(<font>"SplitColumnExample").getOrCreate()  
  
# Sample data  
data = [('John Doe',),  
        ('Jane Smith',),  
        ('Michael Johnson',)]  
  
columns = ['Full Name']  
  
# Creating the DataFrame  
df = spark.createDataFrame(data, columns)  
  
# 拆分列並建立新列  ;
split_col = split(df['Full Name'], ' ')  
df = df.withColumn('First Name', split_col.getItem(0))  
df = df.withColumn('Last Name', split_col.getItem(1))  
  
# Displaying the result  
df.show()  


另外一種程式碼:

# installing pyspark  
!pip install pyspark  
  
# importing necessary modules  
from pyspark.sql import SparkSession  
from pyspark.sql.functions import split  
  
# creating SparkSession object  
spark = SparkSession.builder.appName(<font>"SplitColumnExample").getOrCreate()  
  
# sample data  
data = [('John,Smith,35',),  
        ('Jane,Doe,28',),  
        ('Michael,Johnson,42',)]  
  
columns = ['Full Name,Age']  
  
# creating the DataFrame  
df = spark.createDataFrame(data, columns)  
  
# splitting the column and creating new columns  
split_col = split(df['Full Name,Age'], ',')  
df = df.withColumn('First Name', split_col.getItem(0))  
df = df.withColumn('Last Name', split_col.getItem(1))  
df = df.withColumn('Age', split_col.getItem(2))  
  
# displaying the result  
df.show()  

PySpark DataFrame 和其他技術一樣,有許多優點,也有一些缺點。瞭解這些優點和缺點有助於您做出明智的選擇,判斷 PySpark DataFrame 是否適合您的記錄處理和分析需求。

相關文章