spark-如何根据列值的百分比选择随机行



是否有一种方法可以根据使用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的数量不完全匹配。结果会有一点不同。

最新更新