在 Spark(R) 中进行计算

Doing Calculations In Spark(R)

我正在使用 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")

Error in UseMethod("sdf_register") : no applicable method for 'sdf_register' applied to an object of class "c('tbl_df', 'tbl', 'data.frame')"

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

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

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

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

如果你想将它与 spark 一起使用,首先,存储在复制 data.frame:

时返回的 spark_tbl 变量
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(),首先需要提供一个 "order function"。你可以用 arrange() 得到这个。我假设您希望您的行按 "c" 和 "b" 列排序,因此您的最终管道将如下所示:

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

希望对您有所帮助。