我是闪光灯的新手,我试图将另一个矢量加权的随机法线向量添加到火花df的大量列中。这是我尝试使用mtcars的一个例子。
library(sparklyr)
library(dplyr)
sc1 <- spark_connect(master = "local")
mtc_df = select(mtcars, vs:carb)
mtc_sdf = sdf_copy_to(sc1, mtc_df, name = "mtc_sdf", overwrite = TRUE)
tf_df <- function(df1){
df1 %>%
mutate_at(vars(am:carb), funs(. + vs * rnorm(32, 100, 1)))
}
tf_df(mtc_df) # works
mtc_sdf %>%
spark_apply(function(d) tf_df(d), memory = TRUE) # doesn't work
我收到以下错误:
Error in file(con, "r") : cannot open the connection
In addition: Warning message:
In file(con, "r") :
cannot open file 'C:\....\filea54a7656c3_spark.log': Permission denied
我还尝试在https://spark.rstudio.com/上修改示例,但遇到了同样的错误。
mtc_sdf %>%
spark_apply(function(data) {
data[2:4] + data[1]*rnorm(32*3,100,1)
})
非常感谢任何帮助。
答案 0 :(得分:1)
我试图将另一个向量加权的随机法向量添加到spark df的大量列中
我建议跳过spark_apply
并使用Spark自己的randn
(which gives ~N(0,1)):
mtc_sdf %>% mutate_at(vars(am:carb), funs(. + vs * (randn() * 1 + 100)))
# Source: lazy query [?? x 4]
# Database: spark_connection
vs am gear carb
<dbl> <dbl> <dbl> <dbl>
1 0 1.00000 4.0000 4.00000
2 0 1.00000 4.0000 4.00000
3 1 101.36894 103.1954 98.80757
4 1 100.79066 102.6765 100.91702
5 0 0.00000 3.0000 2.00000
6 1 100.07964 103.1568 100.54303
7 0 0.00000 3.0000 4.00000
8 1 101.90050 103.0402 101.46825
9 1 99.63565 103.7781 101.65752
10 1 99.72587 102.3854 105.09205
关于您的代码:
winutilis
已正确使用。与spark_apply
一起使用的功能:
将数据帧分区转换为数据帧。
所以你不能硬编码行数。您应该使用rnorm(nrow(df1), 100, 1))
。
sparklyr
似乎无法正确序列化由name引用的函数,因此您可能必须内联函数或将其包装在包中:
mtc_sdf %>%
spark_apply(function(df) dplyr::mutate_at(
df, dplyr::vars(am:carb), dplyr::funs(. + vs * rnorm(nrow(df), 100, 1))))
# Source: table<sparklyr_tmp_34ce7faa2d33> [?? x 4]
# Database: spark_connection
vs am gear carb
<dbl> <dbl> <dbl> <dbl>
1 0 1.00000 4.0000 4.00000
2 0 1.00000 4.0000 4.00000
3 1 100.59678 101.9111 100.99830
4 1 98.87146 104.8058 99.20102
5 0 0.00000 3.0000 2.00000
6 1 99.38243 102.8664 100.37921
7 0 0.00000 3.0000 4.00000
8 1 98.99019 103.4996 101.69110
9 1 99.33687 102.3849 103.38833
10 1 100.02103 104.9381 102.07139
# ... with more rows
另请注意,驱动程序中的软件包不会自动附加,因此您必须手动执行或使用完全限定名称引用库函数。