我正在使用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)
可以正常工作,但是会将它存储在我的环境中,而不是火花中。
答案 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")
我希望这会有所帮助。