在sparklyr中使用spark_apply将加权随机法向量添加到多个DF列

时间:2017-12-07 18:38:28

标签: r apache-spark apache-spark-sql sparklyr

我是闪光灯的新手,我试图将另一个矢量加权的随机法线向量添加到火花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)
    })

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

  

我试图将另一个向量加权的随机法向量添加到spark df的大量列中

我建议跳过spark_apply并使用Spark自己的randnwhich 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

关于您的代码:

  • 您遇到的问题看起来像是权限问题。请确保Spark用户具有所有必需的权限,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
    

    另请注意,驱动程序中的软件包不会自动附加,因此您必须手动执行或使用完全限定名称引用库函数。