Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark pyspark-在Spark会话中获得一致的随机值_Apache Spark_Random_Pyspark_Pyspark Sql - Fatal编程技术网

Apache spark pyspark-在Spark会话中获得一致的随机值

Apache spark pyspark-在Spark会话中获得一致的随机值,apache-spark,random,pyspark,pyspark-sql,Apache Spark,Random,Pyspark,Pyspark Sql,我想为正在测试的内容向数据帧添加一列随机值(每行都有一个id)。我正在努力在Spark会话中获得可复制的结果-每个行id都有相同的随机值。我可以使用 from pyspark.sql.functions import rand new_df = my_df.withColumn("rand_index", rand(seed = 7)) 但它只在我在同一个Spark会话中运行时起作用。一旦重新启动Spark并运行脚本,我就不会得到相同的结果 我还尝试定义一个udf,测试是否可以在一个时间间隔

我想为正在测试的内容向数据帧添加一列随机值(每行都有一个id)。我正在努力在Spark会话中获得可复制的结果-每个行id都有相同的随机值。我可以使用

from pyspark.sql.functions import rand

new_df = my_df.withColumn("rand_index", rand(seed = 7))
但它只在我在同一个Spark会话中运行时起作用。一旦重新启动Spark并运行脚本,我就不会得到相同的结果

我还尝试定义一个udf,测试是否可以在一个时间间隔内生成随机值(整数),并使用Python中的randomrandom.seed

import random
random.seed(7)
spark.udf.register("getRandVals", lambda x, y: random.randint(x, y), LongType())
但是没有用

是否有办法确保在Spark会话中生成可重复的随机数,从而使行id获得相同的随机值?我真的很想得到一些指导:)
谢谢你的帮助

我怀疑您获得的种子的公共值相同,但顺序不同,这取决于您的分区,在从磁盘读取时受数据分布的影响,每次可能有更多或更少的数据。但事实上我并不知道你的密码

rand函数生成相同的随机数据(否则种子点是什么),分区以某种方式从中获取一部分数据。如果你看,你应该猜出图案

下面是两个不同基数数据帧的示例。您可以看到种子给出了相同或超集的结果。因此,排序和分区在imo中起着重要作用

from pyspark.sql.functions import *
from pyspark.sql.types import *
from pyspark.sql.functions import col
df1 = spark.range(1, 5).select(col("id").cast("double"))
df1 = df1.withColumn("rand_index", rand(seed = 7))                                   
df1.show()

df1.rdd.getNumPartitions()
print('Partitioning distribution: '+ str(df1.rdd.glom().map(len).collect()))
返回:

+---+-------------------+
| id|         rand_index|
+---+-------------------+
|1.0|0.06498948189958098|
|2.0|0.41371264720975787|
|3.0|0.12030715258495939|
|4.0| 0.2731073068483362|
+---+-------------------+

8 partitions & Partitioning distribution: [0, 1, 0, 1, 0, 1, 0, 1]
+---+-------------------+
| id|         rand_index|
+---+-------------------+
|1.0| 0.9147159860432812|
|2.0|0.06498948189958098|
|3.0| 0.7069655052310547|
|4.0|0.41371264720975787|
|5.0| 0.1982919638208397|
|6.0|0.12030715258495939|
|7.0|0.44292918521277047|
|8.0| 0.2731073068483362|
|9.0| 0.7784518091224375|
+---+-------------------+

8 partitions & Partitioning distribution: [1, 1, 1, 1, 1, 1, 1, 2]
更多数据同样如此:

...
df1 = spark.range(1, 10).select(col("id").cast("double"))
...
返回:

+---+-------------------+
| id|         rand_index|
+---+-------------------+
|1.0|0.06498948189958098|
|2.0|0.41371264720975787|
|3.0|0.12030715258495939|
|4.0| 0.2731073068483362|
+---+-------------------+

8 partitions & Partitioning distribution: [0, 1, 0, 1, 0, 1, 0, 1]
+---+-------------------+
| id|         rand_index|
+---+-------------------+
|1.0| 0.9147159860432812|
|2.0|0.06498948189958098|
|3.0| 0.7069655052310547|
|4.0|0.41371264720975787|
|5.0| 0.1982919638208397|
|6.0|0.12030715258495939|
|7.0|0.44292918521277047|
|8.0| 0.2731073068483362|
|9.0| 0.7784518091224375|
+---+-------------------+

8 partitions & Partitioning distribution: [1, 1, 1, 1, 1, 1, 1, 2]

您可以看到4个常见的随机值-在Spark会话内或会话外。

请显示代码…我想知道是否有明显的疏忽,它是如何工作的。我已经分享了pyspark代码片段,它显示了我如何为rand()设置种子并尝试生成随机值列,你具体在寻找什么?在我的帖子中添加了另一个代码片段来展示我使用python的随机模块定义的udf,请告诉我还有什么可以分享的。另外,如果对否决票进行解释,我将不胜感激,这样我就不会重复我的错误:)如果我正确理解了您的问题,那么您可能希望在
id
列(假设-我希望
id
列在性质上是唯一的)上对您的数据进行排序,然后插入随机值列。类似于-
df.orderBy(df.id.desc()).withColumn(“rand_index”,rand(seed=7))
?非常感谢您的回答!!这是有道理的。在我的特定用例中,我为我附加随机值的每一行都有ID。正如您的示例所示,我的测试也揭示了这一点,id并没有获得分配给它的可复制随机值。你解释了原因,认为这与“分区”方案有关,这也是我的直觉。现在的问题是,有没有办法确保id在spark会话中获得相同的随机值(如何调整分区)?有没有不同的方法来解决我所遗漏的问题?我想我现在应该清楚地说明我的首字母SO post/问题:(很抱歉混淆。我想我已经回答了这个问题。没有办法做到这一点,因为当基数不同时,您无法控制数据的顺序。您看到的是,每个分区的分配至少有一个rand条目,即使分区为空,在这种情况下,它被跳过而不被使用。