2017-05-05 28 views
1

我有一个数据帧如下团结:功能tidyr的收集和使用

library(tidyverse) 
m <- matrix(rep(1:28,each = 10), ncol = 28) 
colnames(m) <- c("co1","col2", LETTERS) 
df <- as_tibble(m) 
df 

newdf<-df %>% 
unite("newcol", c(col1, col2), sep = " ", remove=F) %>% 
gather("col4", "col5", A:Z) 

我想写以下,并将它在sparklyr工作:

dataframe %>% 
    unite(newcol, col1, col2, sep = " ", remove=F) %>% 
    gather("col4", "col5", A:Z) 

团结:凡NEWCOL是包含col1和col2的统一值的新列名称。

收集:其中A:Z是放置在新col4中的键。 col5是将包含当前列A中的变量的新列:Z

有没有人有包装器的用户定义函数,它会在spraklyr包中使用SQL进行收集和联合函数?

+0

我没试过在sparklyr,但也有一些dplyr后端可以只包住功能'do'和数据传递的'.' – alistaire

+1

我猜测你已经看到这是sparklyr GitHub上的问题#255。我也想找到一个临时解决方案。 – Zafar

回答

3

您可以使用SQL和DBI库来实现。

假设您已将您的data.frame复制到Spark中。 (请注意,在colnames函数调用中存在拼写错误,您已将第一列的名称设置为“co1”,而不是“col1”)。现在

copy_to(sc, df) 

,您可以创建一个新的Spark表所需的列有这样的:

DBI::dbSendQuery(sc, "CREATE TABLE new_df AS 
SELECT CONCAT(t1.col1, t1.col2) AS newcol, t1.col1, t1.col2, t2.col4, t2.col5 
FROM df t1 
      LATERAL VIEW EXPLODE (map('A', A, 'B', B, 'C', C, 'D', D, 'E', E, 'F', F, 'G', G, 
      'H', H, 'I', I, 'J', J, 'K', K, 'L', L, 'M', M, 'N', N, 'O', O, 'P', P, 'Q', Q, 
      'R', R, 'S', S, 'T', T, 'U', U, 'V', V, 'W', W, 'X', X, 'Y', Y, 'Z', Z)) t2 as col4, col5 ORDER BY col4 DESC") 

现在,你可以参考这个新的Spark表和Sparklyr使用它:

ref_new_df <- tbl(sc, "new_df") 

我希望这会有所帮助。

编辑来显示结果

> copy_to(sc, df) 
> DBI::dbSendQuery(sc, "CREATE TABLE new_df AS 
+ SELECT CONCAT(t1.col1, t1.col2) AS newcol, t1.col1, t1.col2, t2.col4, t2.col5 
+ FROM df t1 
+    LATERAL VIEW EXPLODE (map('A', A, 'B', B, 'C', C, 'D', D, 'E', E, 'F', F, 'G', G, 
+    'H', H, 'I', I, 'J', J, 'K', K, 'L', L, 'M', M, 'N', N, 'O', O, 'P', P, 'Q', Q, 
+    'R', R, 'S', S, 'T', T, 'U', U, 'V', V, 'W', W, 'X', X, 'Y', Y, 'Z', Z)) t2 as col4, col5 ORDER BY col4 DESC") 
<DBISparkResult> 
    SQL CREATE TABLE new_df AS 
SELECT CONCAT(t1.col1, t1.col2) AS newcol, t1.col1, t1.col2, t2.col4, t2.col5 
FROM df t1 
      LATERAL VIEW EXPLODE (map('A', A, 'B', B, 'C', C, 'D', D, 'E', E, 'F', F, 'G', G, 
      'H', H, 'I', I, 'J', J, 'K', K, 'L', L, 'M', M, 'N', N, 'O', O, 'P', P, 'Q', Q, 
      'R', R, 'S', S, 'T', T, 'U', U, 'V', V, 'W', W, 'X', X, 'Y', Y, 'Z', Z)) t2 as col4, col5 ORDER BY col4 DESC 
    ROWS Fetched: 0 [complete] 
     Changed: 0 
+1

感谢您的支持。当我运行这个命令时,我得到以下错误: 不匹配的输入'LATERAL'期待{,'GROUP','ORDER','HAVING','LIMIT','OR','AND','WINDOW',' (第4行,后20) == SQL == CREATE TABLE new_df AS SELECT CONCAT(t1.col1, t1.col2)as newcol t1.col1,t1.col2,t2.col4,t2.col5 FROM df WHERE t1 IS NOT NULL LATERAL VIEW EXPLODE(地图('A',A,'B',B, - ------------------- ^^^ ' –

+1

@LeviBrackman它适用于我,我编辑了答案,显示我得到的结果。请检查语法?也许这是一个错字。另外,你能否检查列名是否正确? –

+0

@JaimeCaffarel这是一个了不起的解决方案。我有一个类似的问题,我收到以下警告'dbGetQuery(sc,query) 警告消息: 在max(n):没有非缺少参数为max;返回-Inf'你知道这意味着什么吗?谢谢!!!! –