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

问题描述 投票:0回答:1

我有一个包含两个整数列的数据框:

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"))) 

的结果相同

最小、最大列肯定已完全填充...

我看过的问题(并非详尽无遗!):

python pyspark random
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()
© www.soinside.com 2019 - 2024. All rights reserved.