是否有一种方法可以根据使用spark sql的列分布选择随机样本?例如,对于下面的数据框,我想选择总共6行,但大约2行是prod_name = A
, 2行是prod_name = B
, 2行是prod_name = C
,因为它们各占数据的1/3。请注意,每种产品并不总是占1/3的百分比。这只是一个例子。非常感谢你的帮助。
prod_name | value
----------------------
A | 100
A | 200.
A | 300
A | 400
B | 500
B | 600
B | 650
B | 700
C | 500
C | 600
C | 650
C | 700
使用sampleBy应该可以做到。每个prod_name
所需的分数可以通过将期望的行数除以实际的行数来计算:
df=...
prods=df.select('prod_name').distinct().collect()
cnt=df.count()
expected_rows=6 # change this number to adjust of rows in the result
fractions={r['prod_name']:expected_rows/cnt for r in prods}
df.stat.sampleBy('prod_name', fractions).show()
输出:
+---------+-----+
|prod_name|value|
+---------+-----+
| A| 200|
| A| 400|
| B| 500|
| B| 700|
| C| 500|
| C| 700|
+---------+-----+
由于采样涉及随机操作,结果的大小可能与expected_rows
的数量不完全匹配。结果会有一点不同。