我需要从一个给定的列表中随机选择一组元素,这些随机选择需要附加到一个列表中,但必须是唯一的,所以在Python实现中,我使用了一个set来初始化,在while语句的上下文中:
import string
import random
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
my_set=set()
while len(my_set)<n+1: #n being the number of items desired
my_set.add(id_generator())
(id_generator语法归功于https://stackoverflow.com/a/2257449/8840174。)
我想做的是利用Spark的分布式计算,更快地完成上述任务。
从程序上看,我认为需要这样做:我在driver节点上保存这个集合,并将这个函数分发给可以执行id_generator()的工作者,直到我的集合中有n个唯一的项。看起来在PySpark中没有一个与random.choices等价的函数,所以我可能需要使用UDF装饰器在PySpark中注册这个函数。
- 这是0,1之间的分布而不是从某个项目列表中选择的随机选项。https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.sql.functions.rand.html *
@udf
def id_generator():
import string
import random
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
return id_generator()
类似上面的东西?虽然我仍然不清楚如何/如果设置工作的Spark或没有。
This answer是一个不错的想法,尽管我不知道从单个spark Dataframe 中收集值对于数百万次迭代来说是否是一个好主意。
这段代码对于纯Python来说很好用,但是如果可能的话,我希望把它从几个小时加速到几个小时(我需要根据各种规则/值列表生成几个随机生成的列,以便从头开始创建数据集)。
- 我知道id_generator()的大小为6,有大约2,176,782,336个http://mathcentral.uregina.ca/QQ/database/QQ.09.00/churilla1.html组合,所以重复的可能性不大,但是即使没有set()要求,我仍然在为在PySpark中将随机选项从一个列表附加到另一个列表的最佳实现而苦苦挣扎。
这看起来很有希望:Random numbers generation in PySpark
1条答案
按热度按时间dy1byipe1#
如果Spark是最好的方法,这取决于你的使用情况,但是你可以在生成的 Dataframe 上使用函数的udf并删除重复项。这种方法的缺点是,由于删除重复项,很难达到你想要的数据点的确切数量。
注1:我稍微调整了一下函数以使用random.choices。
注2:如果在多个节点上运行,您可能需要确保每个节点使用不同的随机种子。
其中: