使用列条件随机采样 Pyspark 数据框

Randomly Sample Pyspark dataframe with column conditions

我正在尝试对列值满足特定条件的 Pyspark 数据框进行随机抽样。我想使用 sample 方法根据列值随机 select 行。假设我有以下数据框:

+---+----+------+-------------+------+
| id|code|   amt|flag_outliers|result|
+---+----+------+-------------+------+
|  1|   a|  10.9|            0|   0.0|
|  2|   b|  20.7|            0|   0.0|
|  3|   c|  30.4|            0|   1.0|
|  4|   d| 40.98|            0|   1.0|
|  5|   e| 50.21|            0|   2.0|
|  6|   f|  60.7|            0|   2.0|
|  7|   g|  70.8|            0|   2.0|
|  8|   h| 80.43|            0|   3.0|
|  9|   i| 90.12|            0|   3.0|
| 10|   j|100.65|            0|   3.0|
+---+----+------+-------------+------+

我想根据 result 列对每个 0, 1, 2, 3 中的每一个仅采样 1(或任何一定数量),所以我最终会得到这个:

+---+----+------+-------------+------+
| id|code|   amt|flag_outliers|result|
+---+----+------+-------------+------+
|  1|   a|  10.9|            0|   0.0|
|  3|   c|  30.4|            0|   1.0|
|  5|   e| 50.21|            0|   2.0|
|  8|   h| 80.43|            0|   3.0|
+---+----+------+-------------+------+

有没有一种好的编程方法可以实现这一点,即对特定列中给定的每个值采用相同的行数?非常感谢任何帮助!

您可以使用 sampleBy() 其中 returns 分层样本,无需根据每个层给出的分数进行放回。

>>> from pyspark.sql.functions import col
>>> dataset = sqlContext.range(0, 100).select((col("id") % 3).alias("result"))
>>> sampled = dataset.sampleBy("result", fractions={0: 0.1, 1: 0.2}, seed=0)
>>> sampled.groupBy("result").count().orderBy("key").show()

+------+-----+
|result|count|
+------+-----+
|     0|    5|
|     1|    9|
+------+-----+