r - 现在可以将 set.seed 与 Sparklyr 一起使用吗?

标签 r apache-spark sparklyr

我上次使用 Sparklyr(2017 年 10 月)时,在使用 Sparklyr 时使用 set.seed 时出现问题。我不确定确切的问题是什么,而且我似乎无法在任何地方找到任何相关信息。 set.seed 现在是否可以与 Sparklyr 一起正常工作,还是仍然是一个悬而未决的问题?

最佳答案

一般情况

set.seed 工作得很好,它应该在本地 R session a.k.a 驱动程序中(您调用 spark_connect 的地方)。

由于多种原因,包括不同的执行上下文(R、JVM)和/或不同的环境(使用 spark_apply 等方法),它不起作用并且不能跨执行器工作。

使用 Spark 包装器:

使用 ml_*ft_ 等方法,种子由 Spark 设置,通常使用 seed 参数公开。例如ml_kmeans:

> ml_kmeans
function (x, formula = NULL, k = 2L, max_iter = 20L, tol = 1e-04, 
    init_steps = 2L, init_mode = "k-means||", seed = NULL, features_col = "features", 
    prediction_col = "prediction", uid = random_string("kmeans_"), 
    ...) 
{
    UseMethod("ml_kmeans")
}
<environment: namespace:sparklyr>

也可以为 RNG SQL 函数设置种子:

> df %>% mutate(rand = rand(42L), randn = randn(42L)) %>% head(3)
# Source:   lazy query [?? x 3]
# Database: spark_connection
     id  rand  randn
  <int> <dbl>  <dbl>
1     1 0.666  0.409
2     2 0.858  0.881
3     3 0.914 -2.01 
> df %>% mutate(rand = rand(42L), randn = randn(42L)) %>% head(3)
# Source:   lazy query [?? x 3]
# Database: spark_connection
     id  rand  randn
  <int> <dbl>  <dbl>
1     1 0.666  0.409
2     2 0.858  0.881
3     3 0.914 -2.01 

使用执行端 R 代码

据我所知,目前还没有可用的选项。在多台机器上正确设置 RNG 种子将需要 API 来访问低级任务信息,即使假设没有其他非确定性来源,在异构环境中也可能很脆弱。

但是

RNG 状态并不是分布式系统中不确定行为的唯一来源。由于在 Spark 中通常不保证任何特定的执行顺序,因此即使 RNG 状态设置正确,不同运行的结果也可能不同。

总体:

如果你的目标是可重复的研究,你可能仍然可以使用 Spark,但它需要防御性编程,有意识地设置集群,这不是你可以使用内置工具来做的事情,更不用说限制了,高级包装器,如 sparklyr

关于r - 现在可以将 set.seed 与 Sparklyr 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48613867/

相关文章:

在 R 中将数字四舍五入到最接近的 10

r - 为什么 ggplotly 在 rmarkdown 中不能像 ggplot 一样工作

r - 从数据框中的奇数列中减去偶数列

scala - 分解具有不同长度的相同类型的多个列

r - 如何使用 R 中的分解功能分解 JSON 文件中的数据集?

将空列替换为 r 中 Spark 数据帧中另一列中的值

r - IBrokers - reqMktData 导致错误,表示代码为 "ambiguous"

scala - 在 Spark 中处理超过 3GB 的记录大小

java - 仅在 Spark 中可见的 Shapeless 中的 NoSuchMethodError

r - sparklyr 中的完整数据框