2017-06-06 7 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ステートメントにあなたのコマンドを変換する - あなたはそれ故に、これは普通の dataframedplyrに動作しますが、 SparkDataFrameではない理由を集約せずに、集計関数を使用する場合
d %>% group_by(id, x) %>% mutate(y = paste(y, collapse = " ")) 

答えて

4

Spark sqlはそれが好きではありません。

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

pasteCONCAT_WSに翻訳さ:あなたは、エラーメッセージに第2ビットを見れば、これは間違って観察することができます。 concatしかし、を一緒に貼り付けます。

より良い同等物はcollect_listcollect_setですが、出力はlistです。

しかし、あなたはその上に構築することができます

あなたがないあなたがsummarisecollect_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) 

結果:

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

関連する問題