2017-04-09 108 views
1

我正在使用sparklyr库。在Spark中做计算(R)

我有一个变量,wtd我复制到火花:

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

然后,我想做一个计算和存储的火花,而不是在我的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)工作正常,但将其保存在我的环境中,不在火花中。

回答

3

您的操作顺序中的第一个参数应该是“tbl_spark”,而不是常规data.frame。你的命令,

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

工作原理是因为你根本没有使用Spark,只是普通的R data.frames。

如果你想与火花使用它,首先,存储返回的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 

这是因为为了在星火使用row_number(),首先你需要提供一个“高阶函数”。你可以用arrange()。我假设你希望你的行被列“c”和“b”的排序,所以你最终的管道将是这样的:

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

我希望这有助于。

+1

谢谢!这有帮助! –

+0

@JaimeCaffarel这很有趣,你的回答在这一刻帮助我很多! :)我没有得到什么是运行'copy_to'和'sdf_register'之间的区别。 Arent我们在两种情况下都创建了火花datafranes? –

+1

@Noobie谢谢:-)区别在于'copy_to'只是将数据框复制到Spark中,而'sdf_register'为数据框创建Hive元数据,因此您可以使用Hive检查数据(从表“wtd2”在这种情况下)。 –