如何在其他列定义的范围内生成随机数

0 投票
1 回答
31 浏览
提问于 2025-04-13 18:39

我有一个数据表,里面有两列整数:

data = [("A",1, 5), ("B",3, 8), ("C",2, 7)]
df = spark.createDataFrame(data, ["type","min", "max"])

我想用 random.randrange(start,stop,step) 来生成一些随机数,这些随机数的范围是根据这两列的最小值和最大值来定的,但我显然没有成功。

我现在很困惑!我觉得我在用一个本来是针对具体数据的函数,结果却用在了数据列上,但我不知道该怎么解决这个问题。

我尝试过:

df = df.withColumn("rand",randrange(col("min"),col("max")))

TypeError: int() 的参数必须是字符串、字节对象或真实数字,而不是 'Column'

我还尝试过:

def rando(start,stop):
    return randrange(start,stop)
randoUDF = F.udf(rando,IntegerType())
df = df.withColumn("rand",randoUDF("min","max")) 

'ValueError: randrange() 的范围为空 (0,0,0)'
对于 df = df.withColumn("rand",randoUDF(col("min"),col("max"))) 也是一样的结果

最小值和最大值的列肯定是填满的……

我查过的一些问题(并不是全部!):

1 个回答

0

其实,你可以通过一些简单的数学运算来达到同样的效果:

from pyspark.sql import functions as F

df.withColumn("rand", F.rand() * (F.col("max") - F.col("min")) + F.col("min"))

新生成的列会是浮点数格式,但你可以根据需要选择截断或者四舍五入。


如果你想使用随机数包,你需要一个用户定义的函数(UDF)。你几乎已经做到了。我只是修正了一下你的代码:

import random
from pyspark.sql import functions as F, types as T

randoUDF = F.udf(random.randrange, T.IntegerType())
df.withColumn("rand", randoUDF(F.col("min"), F.col("max"))).show()

撰写回答