Spark DataFrame 和 Pandas DataFrame 的區別
Spark DataFrame
Spark DataFrame 是一個分散式資料集,組織成命名列。它是 Apache Spark 中一個關鍵的資料結構,Apache Spark 是一個快速且分散式的計算引擎,針對大資料處理進行了最佳化。在分散式計算環境中,Spark DataFrame 為處理結構化和半結構化資料提供了更高級別的 API。
Pandas DataFrame
Pandas DataFrame 是一個二維帶標籤的資料結構,表示表格資料。它是 Python 中 Pandas 庫提供的核心資料結構之一。DataFrame 以行和列的形式組織資料,類似於表格或電子表格。
優勢
Spark DataFrames | Pandas DataFrames |
---|---|
能夠處理超出單個機器記憶體容量的大型資料集,並利用 Spark 的計算能力。 | 使用者友好的 API,具有直觀的語法,便於管理和分析結構化資料。 |
最佳化資料處理,最大程度地減少資料混洗,並最佳化執行計劃。 | 擁有豐富的庫環境,提供強大的工具,用於資料操作、視覺化和機器學習。 |
透過將工作負載重新分配到叢集中的其他節點來自動從錯誤中恢復。 | 支援多種資料格式,允許與本地資料來源無縫整合。 |
支援多種資料來源,允許與其他資料格式無縫整合。 | 可以在記憶體中完全執行,從而實現快速高效的資料處理。 |
能夠跨機器叢集進行並行處理,使其非常適合大型資料處理任務。 | 提供豐富的資料操作、探索和分析功能和操作。 |
缺點
Spark DataFrames | Pandas DataFrames |
---|---|
需要分散式計算環境和叢集配置,與 Pandas DataFrames 這樣的單機解決方案相比,這會增加複雜性。 | 單個計算機的記憶體容量限制了記憶體,這使得它在處理大型資料集時效率較低。 |
由於計算的分散式特性,它會產生開銷,這可能會導致額外的延遲,使其在處理小型到中型資料集時效率較低。 | 缺乏內建的分散式計算功能,使其在處理大型資料集時效率低於 Spark DataFrames。 |
示例 1
我們將展示使用 PySpark 建立 Spark DataFrame 和使用 pandas 建立 Pandas DataFrame 的差異。
演算法
匯入必要的庫
建立 SparkSession:使用 SparkSession.builder 建立一個構建器物件。
透過建立字典列表來定義資料
使用 createDataFrame(data) 建立 Spark DataFrame。
使用 pd.DataFrame(data) 建立 Pandas DataFrame
顯示每個單獨的 DataFrame。
示例
from pyspark.sql import SparkSession import pandas as pd # Creating a SparkSession spark = SparkSession.builder.appName("SparkDataFrameExample").getOrCreate() # Creating the DataFrames from a list of dictionaries data = [{"name": "Ashwin", "age": 25}, {"name": "Pooja", "age": 30}, {"name": "John", "age": 28}] Sdf = spark.createDataFrame(data) Pdf = pd.DataFrame(data) # Displaying the Spark DataFrame print("Structure of Spark DataFrame") Sdf.show() # Displaying the Pandas DataFrame print("Structure of Pandas DataFrame") print(Pdf)
輸出
Structure of Spark DataFrame +------+---+ | name|age| +------+---+ |Ashwin| 25| | Pooja| 30| | John| 28| +------+---+ Structure of Pandas DataFrame name age 0 Ashwin 25 #displays along with the index number 1 Pooja 30 2 John 28
Spark DataFrame 以表格格式顯示,而 Pandas DataFrame 則以表格形式列印,自動索引從 0 開始。
我們還可以看到,在 pandas dataframe 中,輸出顯示了相應的索引號。
示例 2
我們將使用包含工作的資料建立 Spark DataFrame 和 Pandas DataFrame,然後在兩個 DataFrame 中執行聚合,以找出語法差異並查詢每個工作的計數。
演算法
從匯入 pyspark 和 pandas 開始。
啟動 SparkSession
使用字典列表概述資料,並使用這些記錄建立 pandas 和 spark 資料幀。
聚合 Spark DataFrame 中的資料
Sdf.groupby("job") 透過“job”列組織 DataFrame
count() 用於計算每個工作的出現次數。
聚合 Pandas DataFrame 中的資料
Pdf.groupby("job") 透過“job”列分離 DataFrame
size() 計算每個工作的出現次數
reset_index(name="count") 重置索引並將聚合列重新命名為“count”
列印聚合的 Pandas 和 spark 資料幀。
示例
from pyspark.sql import SparkSession import pandas as pd # Creating a SparkSession spark = SparkSession.builder.appName("SparkDataFrameExample").getOrCreate() # Creating a Spark DataFrame from a list of dictionaries representing jobs data = [{"job": "Engineer"}, {"job": "Analyst"}, {"job": "Analyst"}, {"job": "Manager"}, {"job": "Engineer"}] Sdf = spark.createDataFrame(data) # Creating a Pandas DataFrame representing jobs Pdf = pd.DataFrame(data) # Aggregating data in Spark DataFrame grouped_df_spark = Sdf.groupby("job").count() # Aggregating data in Pandas DataFrame grouped_df_pandas = Pdf.groupby("job").size().reset_index(name="count") # Displaying the aggregated Pandas DataFrame print(grouped_df_pandas) # Displaying the aggregated Spark DataFrame grouped_df_spark.show()
輸出
job count 0 Analyst 2 1 Engineer 2 2 Manager 1 +--------+-----+ | job|count| +--------+-----+ | Analyst| 2| |Engineer| 2| | Manager| 1| +--------+-----+
Spark DataFrame 與 Pandas DataFrame 的比較表
特性 | Spark DataFrame | Pandas DataFrame |
---|---|---|
計算環境 | 用於大資料處理的分散式計算框架,多個節點。 | 用於較小資料集的單節點環境。 |
效能和可擴充套件性 | 高度可擴充套件且適用於大資料。 | 對於小型到中型資料集具有出色的效能。 |
資料處理模型 | 延遲計算和最佳化的執行計劃。 | 用於互動式資料探索的即時計算。 |
語言支援 | 支援 Scala、Java、Python 和 R。 | 主要為 Python 構建,並與 Python 生態系統廣泛整合。 |
索引 | 不提供帶索引的輸出 | 提供從 0 開始的預設索引號 |
資料操作 | 具有廣泛的轉換和操作。 | 提供豐富的資料操作和分析功能。 |
生態系統和整合 | 與 Apache Spark 生態系統無縫整合。 | 與 Python 庫(例如 NumPy、Matplotlib)很好地整合。 |
資料分割槽 | 支援在分割槽級別進行分割槽和並行處理。 | 沒有內建的分割槽功能。 |
記憶體使用 | 針對分散式處理進行了最佳化的記憶體管理。 | 依賴於單節點環境中的可用記憶體。 |
結論
Spark 和 Pandas DataFrame 都是用於處理結構化資料的強大工具,但它們之間存在一些關鍵差異。如果我們在單臺機器上處理小型到中型資料集,Pandas DataFrames 提供了一種方便且高效的解決方案。如果要處理大規模資料處理或在分散式計算環境中工作,則 Spark DataFrames 更適合,因為它們具有可擴充套件性和容錯性。