如何在其他列定义的范围内生成随机数
我有一个数据表,里面有两列整数:
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()