在Spark(R)中进行计算

时间:2017-04-09 04:48:24

标签: r sparklyr

我正在使用sparklyr库。

我有一个变量wtd,我将其复制到spark:

copy_to(sc,wtd)
colnames(wtd) <- c("a","b","c","d","e","f","g")

然后我想进行计算并将其存储在spark中,而不是存储在R的环境中。

当我尝试:

sdf_register(wtd %>% group_by(c,b) %>% filter(row_number()==1) %>%count(d), "wtd2")
  

UseMethod(“sdf_register”)中的错误:   没有适用于'sdf_register'的方法适用于类“c('tbl_df','tbl','data.frame')的对象”

命令wtd2 = wtd %>% group_by(c,b) %>% filter(row_number()==1) %>%count(d)可以正常工作,但是会将它存储在我的环境中,而不是火花中。

1 个答案:

答案 0 :(得分:4)

您的操作序列中的第一个参数应该是&#34; tbl_spark&#34;而不是常规data.frame。你的命令,

wtd2 = wtd %>% group_by(c,b) %>% filter(row_number()==1) %>%count(d)

有效,因为你根本不使用Spark,只是普通的R data.frames。

如果您想将它与spark结合使用,请首先存储复制spark_tbl时返回的data.frame变量:

colnames(wtd) <- c("a","b","c","d","e","f","g")
wtd_tbl <- copy_to(sc, wtd)

然后,您可以使用sdf_register(wtd_tbl %>% ..., "wtd2")执行数据管道。

如果您按照定义执行管道,您将收到一个例外说明:

Error: org.apache.spark.sql.AnalysisException: Window function rownumber() requires window to be ordered

这是因为为了在Spark中使用row_number(),首先需要提供一个&#34; order函数&#34;。您可以使用arrange()进行此操作。我假设你希望你的行按列排序&#34; c&#34;和&#34; b&#34;,所以你的最终管道将是这样的:

sdf_register(wtd_tbl %>% 
               dplyr::group_by(c, b) %>% 
               arrange(c, b) %>% 
               dplyr::filter(row_number() == 1) %>% 
               dplyr::count(d),
             "wtd2")

我希望这会有所帮助。