1

我有一个数据框如下:

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)

Unite:其中 newcol 是包含 col1 和 col2 的联合值的新列名。

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

有没有人有一个包装器的用户定义函数,它可能使用 SQL 在 spraklyr 包中执行收集和联合功能?

4

1 回答 1

3

您可以使用 SQL 和DBI库来完成。

假设您在 Spark 中复制了 data.frame。(请注意,您的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
于 2017-05-06T15:12:13.360 回答