from __future__ import division # Python 2 only
def limitApprox(rdd, n, timeout):
count = rdd.countApprox(timeout)
if count <= n:
return rdd
else:
rec_per_part = count // rdd.getNumPartitions()
required_parts = n / rec_per_part if rec_per_part else 1
return rdd.mapPartitionsWithIndex(
lambda i, iter: iter if i < required_parts else []
)
1条答案
按热度按时间7rtdyuoh1#
如果您想要一个小的示例子集,那么就不能对数据进行任何额外的假设
take
结合parallelize
可能是最佳解决方案:它将触及相对较少的分区(在最佳情况下只有一个分区),并且对于较小的n,网络通信量的成本应该可以忽略不计。
取样(
randomSplit
或者sample
)将需要与相同的完整数据扫描zipWithIndex
与filter
.假设没有数据倾斜,您可以尝试这样的方法来解决:
这仍将访问每个分区,但如果不需要,将尽量避免计算内容
如果存在大数据倾斜,则无法工作
如果分布是均匀的,则所需的时间可能远远超过所需时间,但n<<超过每个分区的平均记录数。
如果分布向高指数倾斜,则可能样本不足。
如果数据可以表示为
Row
你可以尝试另一个技巧: