在 sparklyr (R+spark) 中提取列名的简单命令

Posted

技术标签:

【中文标题】在 sparklyr (R+spark) 中提取列名的简单命令【英文标题】:Simple command for extracting column names in sparklyr (R+spark) 【发布时间】:2017-02-20 02:18:14 【问题描述】:

在base r中,很容易从数据框中提取列(变量)的名称

> testdf <- data.frame(a1 = rnorm(1e5), a2 = rnorm(1e5), a3 = rnorm(1e5), a4 = rnorm(1e5), a5 = rnorm(1e5), a6 = rnorm(1e5))  
> names(testdf)  
[1] "a1" "a2" "a3" "a4" "a5" "a6"

但是在使用 sparklyr 时,事情变得更加复杂。将数据框复制到spark后,

> testdf_tbl <- copy_to(sc, testdf, overwrite = TRUE)  
> names(testdf_tbl)  
[1] "src" "ops"

变量名实际上位于“ops”的深处

> testdf_tbl$ops$vars  
[1] "a1" "a2" "a3" "a4" "a5" "a6"

如果这就是全部,就不会有问题(也不需要问这个问题)。但是,每次在 testdf_tbl 上发生操作时,列/变量的名称都会改变它们的位置,如下所示..

> testdf_tbl <- testdf_tbl %>% select(-a1)  
> testdf_tbl$ops$vars  
NULL  
> testdf_tbl$ops$x$vars  
[1] "a1" "a2" "a3" "a4" "a5" "a6"  

另一个操作将另一个 $x 添加到路径中......等等。

> testdf_tbl <- testdf_tbl %>% select(-a2)  
> testdf_tbl$ops$x$vars  
NULL  
> testdf_tbl$ops$x$x$vars  
[1] "a1" "a2" "a3" "a4" "a5" "a6"  

更糟糕的是,变量列表并没有反映我们所做的选择操作,它们仍然将 a1、a2 列为列名。其中,

> head(testdf_tbl)  
Source:   query [?? x 4]  
Database: spark connection master=local[24] app=sparklyr local=TRUE  
        a3           a4          a5         a6  
        dbl          dbl         dbl        dbl  
1 -1.146368875  1.691698406  0.43231629  1.3349111  
2  0.664928710 -1.332242020  0.05380729  1.0139253  
3  1.158095695 -0.097098980 -0.61885204  0.1504693  
4  0.001595841 -0.003765908  0.27935192 -0.3039085  
5 -0.133446040  0.269329076  1.57210274  1.7762602  
6  0.006468698 -1.300439537  0.74057307  0.1320428  

很明显,选择操作的影响在于 spark 数据帧的使用方式。

当然,有一种简单直接的方法可以在 sparklyr 中提取变量/列的当前名称,例如 base r 中的 names()

【问题讨论】:

欢迎来到 ***。请查看formatting guide 非常感谢!那好多了。 你可以在这里使用dplyr::tbl_vars()。由于sparklyr 使用dplyr 兼容的接口实现了Spark 连接,因此dplyr 为这些操作提供的例程应该可以按您的预期工作。 cran.rstudio.com/web/packages/dplyr/vignettes/databases.html 也可能会有所帮助。 完美。成功了! 【参考方案1】:

正如 Kevin 所说,tbl_vars 有效,但如果您希望它更像“base-R”,colnames 也可以。

【讨论】:

以上是关于在 sparklyr (R+spark) 中提取列名的简单命令的主要内容,如果未能解决你的问题,请参考以下文章

Sparklyr:如何将列表列分解为Spark表中自己的列?

在 R 和 Sparklyr 中,将表写入 .CSV (spark_write_csv) 会产生许多文件,而不是一个文件。为啥?我可以改变吗?

使用 sparklyr 在 R 中将字符串转换为逻辑字符串

为啥 R lubridate::duration 数据类型使用 sparklyr 转换为 spark 中的字符?

Sparklyr - 在 spark-submit 中更改日志级别

R - 如何使用 sparklyr 复制火花数据框中的行