2017-06-06 43 views
2

我想在sparklyr中使用group_by()和mutate()函數來連接組中的行。Sparklyr:使用group_by,然後連接來自組中的行的字符串

下面是一個簡單的例子,我覺得應該工作,但不會:

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上使用相同的代碼工作正常:

會將您的命令給 sql聲明 -
d %>% group_by(id, x) %>% mutate(y = paste(y, collapse = " ")) 

回答

4

Spark sql爲什麼這部作品在dplyr與普通dataframe而不是在一個SparkDataFrame不喜歡它,如果你使用聚合函數不聚集,因此原因。你可以看到這是怎麼回事錯的,如果你在錯誤信息看第二位:

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

paste被翻譯成CONCAT_WS。然而,concat會將粘貼在一起。

一個更好的等價物將是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 
+0

謝謝,非常有用的答案 – Maggie

相關問題