2017-12-07 8 views
1

Ich bin neu zu sparklyr und ich versuche, zufällige normale Vektoren mit einem anderen Vektor zu einer großen Anzahl von Spalten eines Funken df hinzuzufügen. Dies ist ein Beispiel, das ich mit mtcars versucht habe.Verwenden von spark_apply in sparklyr, um gewichtete zufällige Normalenvektoren zu mehreren DF-Spalten hinzuzufügen

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 

bekomme ich folgende Fehlermeldung:

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 

Ich versuchte auch das Beispiel auf https://spark.rstudio.com/ anzupassen bekam aber den gleichen Fehler.

mtc_sdf %>% 
    spark_apply(function(data) { 
     data[2:4] + data[1]*rnorm(32*3,100,1) 
    }) 

Jede Hilfe würde sehr geschätzt werden.

+0

Können Sie versuchen, vollständige (oder schreiben) Berechtigungen zum Protokollieren des Verzeichnisses? Damit können Sie Protokolle verwenden und das Problem identifizieren. –

+0

Danke für die Antwort Wie würde ich Log-Berechtigung in R ändern - ich habe es vorher nicht getan? Was meinst du mit "add vs"? – swany

+0

Können Sie als Admin oder Root ausführen, um zu sehen, ob das etwas damit zu tun hat? – JMA

Antwort

1

I'm trying to add random normal vectors weighted by another vector to a large number of columns of a spark df

würde ich empfehlen, spark_apply Skipping und mit Spark eigenen 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 

Code Bezug:

  • Problem Sie Erfahrung sieht aus wie Genehmigungsproblem. Stellen Sie sicher, dass der Spark-Benutzer über alle erforderlichen Berechtigungen verfügt und winutilis ordnungsgemäß verwendet werden.
  • Funktion mit spark_apply verwendet:

    transforms a data frame partition into a data frame.

    So können Sie Reihen hart Codenummer nicht. Sie sollten lieber etwas wie rnorm(nrow(df1), 100, 1)) verwenden.

  • sparklyr scheint nicht richtig funktioniert mit Namen referenziert serialisiert, so dass Sie die Funktion Inline könnten müssen oder es in einem Paket wickeln:

    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 
    

    auch nicht verpackt, dass von dem Fahrer bitte werden nicht automatisch angehängt, Sie müssen es also manuell tun oder Bibliotheksfunktionen mit vollständig qualifizierten Namen referenzieren.

+0

Das funktioniert, großartig! Die Inlining der Funktion und die explizite Referenzierung von dplyr machten den Unterschied. Auch Sie haben Recht, dass randn() besser ist. Es läuft viel schneller. Ich denke, meine Berechtigungen Fehler ist ein Problem für das Debuggen statt Funke zu laufen. Vielen Dank! – swany

Verwandte Themen