如何从 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.