【问题标题】:Pyspark - set random seed for reproducible valuesPyspark - 为可重现的值设置随机种子
【发布时间】:2018-02-12 03:51:59
【问题描述】:

我有一个 pyspark 数据框,我想以重复的方式添加随机值以保证相同的输出。我试过设置 numpy.random.seed 和 random.seed,但是下面代码的每次执行都会继续生成不同的随机值序列。

 +---+---+---+---+---+
 | 7 | 15| 19| 21| 27|
 +---------------+---+
 | 0 |  1|  0|  0|  0|
 | 0 |  0|  0|  1|  0|
 | 0 |  0|  0|  1|  0|
 | 2 |  0|  0|  0|  0|
 | 4 |  0|  3|  0|  0|
 | 5 |  0| 25|  0|  0| 
 | 6 |  2|  0|  0|  0| 

这是我当前的实现:

import random
import numpy as np

#set seed
random.seed(1234)
np.random.seed(1234)

#create dataframe
df = sc.parallelize([
[ 0, 1, 0, 0, 0],
[ 0, 0, 0, 1, 0],
[ 0, 0, 0, 1, 0],
[2, 0, 0, 0, 0],
[0, 3, 0, 0, 0],
[ 0, 25,0, 0, 0],
[2, 0, 0, 0, 0],
]).toDF(('7', '15', '19', '21', '27'))

 random_df = data.select("*").rdd.map(
        lambda x, r=random: [Row(float(r.random() + row)) for row in x]).toDF(data.columns)

在我对上述解决方案的最新尝试中,我将对 random 的引用传递到我的 lambda 表达式中,但是尽管设置了种子,但每次执行我仍然得到不同的值。关于如何解决这一挑战的任何想法或想法?

【问题讨论】:

    标签: random pyspark apache-spark-sql


    【解决方案1】:
    from pyspark.sql.functions import col, rand
    random_df = df.select(*((col(c) + rand(seed=1234)).alias(c) for c in df.columns))
    

    【讨论】:

    • 如何确保跨火花会话的可重现值?想知道你能不能帮忙,我在这里单独问了这个:stackoverflow.com/q/59077897/5262014?sem=2
    • @AshishKumar 可重现的值应该始终相同。您可能以不同的顺序使用它,因此我建议对列进行排序,然后验证您是否仍然观察到任何差异。谢谢!
    • @Prem 你是对的!正是我所观察到的 - 随机值没有分配给相同的行(df 中的每一行都有一个 id)。所以我的问题是是否有可能确保将相同的随机值分配给 id 以实现可重复性?这也是我链接的 SO 帖子所询问的内容,不胜感激任何帮助/指导 :)
    猜你喜欢
    • 2016-01-14
    • 1970-01-01
    • 2021-03-23
    • 2020-03-18
    • 2014-11-21
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多