sparklyr(R+spark)中提取列名的简单命令
Simple command for extracting column names in sparklyr (R+spark)
在 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 进行操作时,columns/variables 的名称都会更改其位置,如下所示..
> 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"
更糟糕的是,变量列表并没有反映我们所做的select操作,它们仍然将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
很明显,select 操作对 spark 数据帧的使用方式产生了影响。
当然,有一种简单直接的方法可以提取 sparklyr 中 variables/columns 的当前名称,如 base r.names()
中的 la names()
。
正如凯文所说,tbl_vars
有效,但如果你想让它更像 "base-R",colnames
也可以。
在 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 进行操作时,columns/variables 的名称都会更改其位置,如下所示..
> 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"
更糟糕的是,变量列表并没有反映我们所做的select操作,它们仍然将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
很明显,select 操作对 spark 数据帧的使用方式产生了影响。
当然,有一种简单直接的方法可以提取 sparklyr 中 variables/columns 的当前名称,如 base r.names()
中的 la names()
。
正如凯文所说,tbl_vars
有效,但如果你想让它更像 "base-R",colnames
也可以。