Sparklyr:使用group_by,然后从组中的行连接字符串

时间:2017-06-06 21:15:57

标签: r data-science sparklyr

我正在尝试使用sparklyr中的group_by()和mutate()函数来连接组中的行。

这是一个我认为应该有效的简单示例,但不是:

library(sparkylr)
d <- data.frame(id=c("1", "1", "2", "2", "1", "2"), 
             x=c("200", "200", "200", "201", "201", "201"), 
             y=c("This", "That", "The", "Other", "End", "End"))
d_sdf <- copy_to(sc, d, "d")
d_sdf %>% group_by(id, x) %>% mutate( y = paste(y, collapse = " "))

我希望它产生的是:

Source: local data frame [6 x 3]
Groups: id, x [4]

# A tibble: 6 x 3
      id      x         y
  <fctr> <fctr>     <chr>
1      1    200 This That
2      1    200 This That
3      2    200       The
4      2    201 Other End
5      1    201       End
6      2    201 Other End

我收到以下错误:

Error: org.apache.spark.sql.AnalysisException: missing ) at 'AS' near '' '' in selection target; line 1 pos 42

请注意,在data.frame上使用相同的代码可以正常工作:

d %>% group_by(id, x) %>% mutate( y = paste(y, collapse = " "))

1 个答案:

答案 0 :(得分:8)

如果你在没有聚合的情况下使用聚合函数,

Spark sql不喜欢它,因此dplyr使用普通dataframe而不是{{1}的原因} - SparkDataFrame将您的命令转换为sparklyr语句。如果您查看错误消息中的第二位,您可以观察到这种错误:

sql

== SQL == SELECT `id`, `x`, CONCAT_WS(' ', `y`, ' ' AS "collapse") AS `y` 被翻译为paste。但是,CONCAT_WS会将粘贴在一起。

更好的等价物是concatcollect_list,但它们会产生collect_set个输出。

但你可以在此基础上继续:

如果希望在结果中复制相同的行,则可以使用listsummarisecollect_list

paste

结果:

res <- d_sdf %>% 
      group_by(id, x) %>% 
      summarise( yconcat =paste(collect_list(y)))

如果您 希望复制行,则可以将其重新加入原始数据:

Source:     lazy query [?? x 3]
Database:   spark connection master=local[8] app=sparklyr local=TRUE
Grouped by: id

     id     x         y
  <chr> <chr>     <chr>
1     1   201       End
2     2   201 Other End
3     1   200 This That
4     2   200       The

结果:

d_sdf %>% left_join(res)