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

Posted

技术标签:

【中文标题】Sparklyr:使用 group_by,然后连接组中行中的字符串【英文标题】:Sparklyr: Use group_by and then concatenate strings from rows in a group 【发布时间】:2017-11-08 01:22:53 【问题描述】:

我正在尝试使用 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】:

Spark sql 不喜欢在不聚合的情况下使用聚合函数,因此这在 dplyr 和普通 dataframe 中有效,但在 SparkDataFrame 中无效 - sparklyr 将您的命令转换为sql 声明。如果您查看错误消息中的第二个位,您会发现这是错误的:

== SQL ==
SELECT `id`, `x`, CONCAT_WS(' ', `y`, ' ' AS "collapse") AS `y`

paste 被翻译成CONCAT_WSconcat 但是会将粘贴在一起。

更好的等价物是collect_listcollect_set,但它们会产生list 输出。

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

如果您希望在结果中复制同一行,您可以使用summarisecollect_listpaste

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)

结果:

Source:     lazy query [?? x 4]
Database:   spark connection master=local[8] app=sparklyr local=TRUE

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

【讨论】:

谢谢,非常有用的回答

以上是关于Sparklyr:使用 group_by,然后连接组中行中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

将 sparklyr 连接到远程 spark 连接

使用 dplyr、group_by 和折叠或汇总连接字符串/行,但保持 NA 值 [重复]

R使用dplyr group_by / sum for循环,作为连接列表输出

从 JDBC 连接读取时如何使用谓词?

使用 dplyr、group_by 与 mutate() 或 summarise() & str_c() 或 paste() & 折叠连接字符串/行,但保持 NA & 所有字符

Rails:group_by 然后映射孩子