【问题标题】:functions for tidyr's gather and unite usingtidyr 的收集和联合功能
【发布时间】:2017-10-04 10:11:46
【问题描述】:

我有一个数据框如下:

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 中的变量的新列

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

【问题讨论】:

  • 我还没有在 sparklyr 中尝试过,但是使用一些 dplyr 后端,您可以将函数包装在 do 中并将数据作为 . 传入
  • 我猜你已经看到这是 sparklyr GitHub 上的 issue #255。我也想找到一个临时解决方案。

标签: r apache-spark tidyr sparklyr


【解决方案1】:

您可以使用 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

【讨论】:

  • 谢谢。当我运行此命令时,我收到以下错误:不匹配的输入'LATERAL'期待{,'GROUP','ORDER','HAVING','LIMIT','OR','AND','WINDOW', 'UNION'、'EXCEPT'、'INTERSECT'、'SORT'、'CLUSTER'、'DISTRIBUTE'}(第 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 t1 不为 NULL 横向视图爆炸(map('A', A, 'B', B, -------- -------------^^^ '
  • @LeviBrackman 它对我有用。我已经编辑了显示我得到的结果的答案。拜托,你能检查一下语法吗?也许这是一个错字。另外,你能检查一下列名是否正确吗?
  • @JaimeCaffarel 这是一个了不起的解决方案。我有类似的问题,我收到以下警告dbGetQuery(sc, query) Warning message: In max(n) : no non-missing arguments to max; returning -Inf 你知道那是什么意思吗?谢谢!!!!
  • @Noobie 非常感谢。我不确定您收到的警告信息。这对我来说听起来很神秘。在其他DBI 函数(例如dbFetch)中,参数n 与要检索的行数有关,Inf 用于所有行,但我不确定您为什么会收到该警告。
猜你喜欢
  • 2019-08-03
  • 2018-02-08
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
相关资源
最近更新 更多