python 使用PySpark从随机项函数创建集合

mrwjdhj3  于 2023-01-04  发布在  Python
关注(0)|答案(1)|浏览(193)

我需要从一个给定的列表中随机选择一组元素,这些随机选择需要附加到一个列表中,但必须是唯一的,所以在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中注册这个函数。

@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

dy1byipe

dy1byipe1#

如果Spark是最好的方法,这取决于你的使用情况,但是你可以在生成的 Dataframe 上使用函数的udf并删除重复项。这种方法的缺点是,由于删除重复项,很难达到你想要的数据点的确切数量。
注1:我稍微调整了一下函数以使用random.choices。
注2:如果在多个节点上运行,您可能需要确保每个节点使用不同的随机种子。

import string
import random
from pyspark.sql import SparkSession
from pyspark.sql.types import StringType
from pyspark.sql.functions import udf

SIZE = 10 ** 6

spark = SparkSession.builder.getOrCreate()

@udf(StringType())
def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
    return ''.join(random.choices(chars, k=size))

df = spark.range(SIZE)

df = df.withColumn('sample', id_generator()).drop('id')

print(f'Count: {df.count()}')
print(f'Unique count: {df.dropDuplicates().count()}')

df.show(5)

其中:

Count: 1000000                                                                  
Unique count: 999783                                                            
+------+
|sample|
+------+
|QTOVIM|
|NEH0SY|
|DJW5Q3|
|WMEKRF|
|OQ09N9|
+------+
only showing top 5 rows

相关问题