我最后一次与Sparklyr(17年10月)一起玩时,在使用Sparklyr时使用set.seed存在问题。我不确定究竟是什么问题,我似乎无法在任何地方找到任何相关信息。 set.seed现在是否正常使用Sparklyr,还是一个悬而未决的问题?
答案 0 :(得分:1)
一般
set.seed
在本地R会话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
这样的高级包装器。