PySpark 的 randomSplit() 和 sample() 方法


PySpark 是一款用於大資料處理和分析的開源框架,提供了強大的方法來處理大型資料集。在處理海量資料時,一次性處理所有資料通常是不切實際的。資料取樣,即選擇資料的代表性子集,對於高效分析至關重要。在 PySpark 中,兩種常用的資料取樣方法是 randomSplit() 和 sample()。這些方法允許我們出於不同目的提取資料集的子集,例如測試模型或探索資料模式。

在本文中,我們將探討 PySpark 中的 randomSplit() 和 sample() 方法,瞭解它們之間的區別,並學習如何有效地使用它們進行資料取樣。無論您是 PySpark 新手還是有經驗的使用者,瞭解這些方法都將增強您處理大型資料集並獲得寶貴見解的能力。因此,讓我們深入瞭解 PySpark 的 randomSplit() 和 sample() 方法,並發現資料取樣在大資料分析中的強大功能。

PySpark randomSplit() 和 sample() 方法簡介

資料取樣的重要性

資料取樣在許多資料分析任務中都至關重要。透過取樣,我們可以使用資料集的可管理子集,同時仍然保留整個資料集的基本特徵。透過取樣,我們可以顯著降低計算開銷,加速分析,並深入瞭解底層資料分佈。

PySpark randomSplit() 方法

PySpark 中的 randomSplit() 方法允許我們根據提供的權重將 DataFrame 或 RDD(彈性分散式資料集)拆分為多個部分。每個權重表示應分配給相應拆分的資料比例。

以下是 randomSplit() 的語法:

randomSplit(weights, seed=None)
  • weights:一組權重,指示每個拆分的相對大小。權重總和應為 1.0。

  • seed(可選):用於可重複性的隨機種子。

讓我們深入瞭解一個示例,以瞭解 randomSplit() 在實踐中的工作原理。

from pyspark.sql import SparkSession

# Create a SparkSession
spark = SparkSession.builder.getOrCreate()

# Load a DataFrame from a CSV file
data = spark.read.csv('data.csv', header=True, inferSchema=True)

# Split the data into 70% and 30% randomly
train_data, test_data = data.randomSplit([0.7, 0.3], seed=42)

在上面的示例中,我們首先建立了一個 SparkSession,它是 PySpark 的入口點。然後,我們使用 spark.read.csv() 方法從 CSV 檔案載入 DataFrame。之後,我們應用 randomSplit() 方法將資料拆分為兩部分:70% 用於訓練 (train_data) 和 30% 用於測試 (test_data)。指定種子可確保拆分在多次執行中保持一致,這對於可重複性至關重要。

PySpark sample() 方法

PySpark 中的 sample() 方法用於從 DataFrame 或 RDD 中提取隨機樣本。與 randomSplit()(將資料劃分為固定大小的拆分)不同,sample() 允許我們直接將樣本大小指定為分數。

以下是 sample() 的語法:

sample(withReplacement, fraction, seed=None)
  • withReplacement:一個布林引數,指示是否應有放回或無放回地進行取樣。如果設定為 True,則取樣可以多次選擇相同的元素。

  • fraction:將包含在樣本中的資料的百分比。分數應在 0 到 1 的範圍內,表示總資料的百分比。

  • seed(可選):用於可重複性的隨機種子。

讓我們考慮一個示例,以瞭解 sample() 在實踐中的工作原理。

from pyspark.sql import SparkSession

# Create a SparkSession
spark = SparkSession.builder.getOrCreate()

# Load a DataFrame from a CSV file
data = spark.read.csv('data.csv', header=True, inferSchema=True)

# Extract a 10% sample from the data
sample_data = data.sample(withReplacement=False, fraction=0.1, seed=42)

在上面的示例中,我們首先建立了一個 SparkSession 並從 CSV 檔案載入 DataFrame。然後,我們應用 sample() 方法從資料中提取 10% 的隨機樣本。透過將 withReplacement 設定為 False,我們確保每行在樣本中最多被選擇一次。指定的種子提供可重複性,使我們能夠在多次執行中獲得相同的樣本。

randomSplit() 和 sample() 之間的區別

儘管 randomSplit() 和 sample() 都用於 PySpark 中的資料取樣,但它們的功能和用例不同。

  • randomSplit() 主要用於根據提供的權重將資料劃分為固定大小的拆分。當您希望將資料拆分為不同的部分(例如訓練-測試拆分或為並行處理對資料集進行分割槽)時,此方法很有用。它確保根據指定的權重維護每個拆分中的資料比例。

  • sample() 用於根據指定的比例從 DataFrame 或 RDD 中提取隨機樣本。與 randomSplit() 不同,sample() 提供了更大的靈活性,因為它允許您直接控制樣本大小。此方法適用於探索性資料分析、建立用於原型設計或除錯的資料子集等任務。

資料取樣的優勢

  • 資源效率:透過最大限度地減少要處理的資料量,取樣可以更有效地利用計算資源。這在處理佔用大量記憶體或需要大量處理能力的大型資料集時至關重要。

  • 速度和可擴充套件性:取樣可以加快資料處理和分析速度,因為使用較小的樣本可以減少所需的計算時間。它還透過允許分析資料集的一部分來增強可擴充套件性,從而可以處理更大的資料集。

  • 探索性分析:取樣通常用於探索性資料分析,以獲得初步見解並瞭解資料的特徵。透過檢查較小的樣本,分析師可以識別模式、趨勢和異常值,這可以為後續分析提供資訊。

  • 原型設計和除錯:取樣在模型開發的早期階段很有用,它允許資料科學家在資料集的較小子集上對演算法進行原型設計和測試。它還有助於在將模型應用於整個資料集之前進行除錯和識別問題。

結論

總之,PySpark 的 randomSplit() 和 sample() 方法為資料取樣提供了有價值的功能。randomSplit() 非常適合將資料劃分為固定大小的拆分,而 sample() 允許根據指定的比例提取隨機子集。這些方法透過減少計算開銷並保留基本資料特徵來實現高效分析。總的來說,它們在以簡化方式從大型資料集中提取見解方面發揮著至關重要的作用。

更新於: 2023-07-25

670 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告