如何從 PySpark DataFrame 中獲取隨機行?


在 PySpark 中,處理大型資料集通常需要從 DataFrame 中提取隨機行,用於各種目的,例如抽樣或測試。但是,由於 Spark 的分散式特性,選擇隨機行的過程可能具有挑戰性。

在本文中,我們探討了應對此任務的有效技術,討論了不同的方法並提供了程式碼示例,以幫助您輕鬆地從 PySpark DataFrame 中提取隨機行。

如何從 PySpark DataFrame 中獲取隨機行?

以下是我們可以從 PySpark DataFrame 中獲取隨機行的方法:

方法 1:使用 orderBy 和 limit 函式

從 PySpark DataFrame 中選擇隨機行的一種方法是使用 orderBy 和 limit 函式。我們可以使用 rand 函式向 DataFrame 新增一個隨機列,然後按此列對 DataFrame 進行排序,最後使用 limit 函式選擇第一行。

要使用 orderBy 和 limit 從 PySpark DataFrame 中獲取隨機行,請使用 rand() 新增一個隨機列,按隨機列對 DataFrame 進行排序,然後使用 limit(1) 選擇第一行。此方法隨機打亂行,允許您從 DataFrame 中獲取隨機行。

方法 2:使用 sample 函式進行取樣

另一種方法是使用 sample 函式從 PySpark DataFrame 中隨機取樣行。透過指定一個分數並將 withReplacement 設定為 False,我們可以取樣單個隨機行。

要使用取樣從 PySpark DataFrame 中獲取隨機行,請使用 sample 函式。指定要取樣的行分數,將 withReplacement 設定為 False 以獲取唯一行,並提供一個種子以確保可重複性。此方法從 DataFrame 中隨機選擇一個行的子集,允許您獲取隨機行。

方法 3:將 DataFrame 轉換為 RDD 並進行取樣

PySpark DataFrame 可以轉換為 RDD(彈性分散式資料集)以獲得更大的靈活性。我們可以將 DataFrame 轉換為 RDD,然後使用 takeSample 函式檢索隨機行。

要透過將 PySpark DataFrame 轉換為 RDD 來獲取隨機行,請使用 DataFrame 的 rdd 屬性獲取 RDD 表示形式。然後,在 RDD 上應用 takeSample 函式以隨機選擇一行。此方法允許您直接從 RDD 中進行取樣,有效地從原始 DataFrame 中檢索隨機行。

這些方法提供了從 PySpark DataFrame 中提取隨機行的不同方法。根據您的具體需求和資料集的特徵,您可以選擇最適合您需求的方法。

以下程式示例展示了所有方法:

示例

from pyspark.sql import SparkSession
from pyspark.sql.functions import rand

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

# Create a sample DataFrame
data = [("Alice", 25), ("Bob", 30), ("Charlie", 35), ("David", 40), ("Eve", 45)]
df = spark.createDataFrame(data, ["Name", "Age"])

# Show the DataFrame
df.show()

# Approach 1: Using the `orderBy` and `limit` functions
df_with_random = df.withColumn("random", rand())
random_row_1 = df_with_random.orderBy("random").limit(1)
random_row_1.show()

# Approach 2: Using the `sample` function
random_row_2 = df.sample(withReplacement=False, fraction=0.1, seed=42)
random_row_2.show()

# Approach 3: Converting DataFrame to RDD and sampling
rdd = df.rdd
random_row_3 = rdd.takeSample(False, 1)
print(random_row_3)

輸出

+-------+---+
|   Name|Age|
+-------+---+
|  Alice| 25|
|    Bob| 30|
|Charlie| 35|
|  David| 40|
|    Eve| 45|
+-------+---+

+-------+---+-------------------+
|   Name|Age|             random|
+-------+---+-------------------+
|Charlie| 35|0.27493566011232994|
+-------+---+-------------------+

+----+---+
|Name|Age|
+----+---+
| Bob| 30|
+----+---+

[Row(Name='Charlie', Age=35)]

以上示例說明了從 PySpark DataFrame 中檢索隨機行的不同方法。方法 1 使用 orderBy 和 limit 函式新增一個隨機列,按該列對 DataFrame 進行排序,並選擇第一行。方法 2 利用 sample 函式對 DataFrame 的行進行部分取樣。方法 3 涉及將 DataFrame 轉換為 RDD 並使用 takeSample 函式檢索隨機行。

結論

總之,我們探討了從 PySpark DataFrame 中檢索隨機行的不同方法。使用 orderBy 和 limit 函式,我們添加了一個隨機列,對 DataFrame 進行排序,並選擇了第一行。或者,我們使用 sample 函式對 DataFrame 的行進行部分取樣。

此外,我們討論了將 DataFrame 轉換為 RDD 並使用 takeSample 函式檢索隨機行。這些方法為在 PySpark 中選擇隨機行提供了靈活性和便利性,滿足不同的用例和資料集大小。選擇最適合您隨機性和效率要求的方法。

更新於: 2023-07-24

4K+ 閱讀量

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告

© . All rights reserved.