PySpark:使用行的主键作为rand

时间:2019-03-26 21:25:34

标签: apache-spark pyspark apache-spark-sql

我正在尝试使用PySpark中的rand函数生成具有随机数的列。我希望rand函数将行的主键作为种子,以便数字可复制。但是,当我运行时:

df.withColumn('rand_key', F.rand(F.col('primary_id')))

我收到错误

  

TypeError:“列”对象不可调用

如何将行中的值用作兰德种子?

1 个答案:

答案 0 :(得分:1)

使用F.rand(seed)函数的问题是它需要很长的seed参数和treats it as literal(静态)。

解决此问题的一种方法是创建自己的rand函数,该函数将column作为参数:

import random

def rand(seed):
   random.seed(seed)
   return random.random()

from pyspark.sql.functions import udf
from pyspark.sql.types import DoubleType

rand_udf = udf(rand, DoubleType())
df  = spark.createDataFrame([(1, 'a'), (2, 'b'), (1, 'c')], ['a', 'b'])
df.withColumn('rr', rand_udf(df.a)).show()
+---+---+-------------------+
|  a|  b|                 rr|
+---+---+-------------------+
|  1|  a|0.13436424411240122|
|  2|  b| 0.9560342718892494|
|  1|  c|0.13436424411240122|
+---+---+-------------------+