我有一个包含两个整数列的数据框:
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")))
最小、最大列肯定已完全填充...
我看过的问题(并非详尽无遗!):
不太正确
理论上我可以使用生成分数列的方式,但数据集中有数百万行,所以这感觉像是一个糟糕的解决方案
实际上,您可以通过一些基本数学获得相同的结果:
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()