我正在使用RStudio的Spark扩展之一来刷新我的知识。
坦白地说,无论我看哪里,我都发现dplyr
在实现甚至最简单的结果时不必要地复杂,大多数情况下令人痛苦甚至晦涩难懂。
这里是从该网站中获取的一个示例。将mtcars
数据集复制到名称为mtcars_tbl
的Spark
集群中,然后在筛选出具有100马力以上的汽车时,"tbl_spark"、"tbl_sql"、"tbl_lazy"、"tbl"类表被分成包含于2个组件列表中的train和test子集。
列表名为'partitions',实现它的dplyr
代码如下:
partitions <- mtcars_tbl %>% filter(hp >= 100) %>%
mutate(cyl8 = cyl == 8) %>%
sdf_partition(training = 0.5, test = 0.5, seed = 1099)
注意: 在我看来,H2O
的做法更清晰、更具信息量。
然后,在 H2O
平台上训练一个模型,拟合各种汽车重量和气缸配置的“mpg”。
在某个时刻——为了预测目的——需要从测试子集中选择(隔离)列“mpg”,并将其用作数值向量。
以下是针对这么简单的操作实现的 dplyr
代码:
mpg1 <- partitions$test %>%
select(mpg) %>%
collect() %>%
`[[`("mpg")
...这里是应用于“partitions”列表的data.table
代码,清晰、紧凑、简单:
mpg2 <- as.data.frame(partitions$test)[['mpg']]
mpg3 <- as.data.table(partitions$test)[['mpg']]
注意:如果一开始将这两个子集视为dataframe
或data.table
,则代码会更加简洁。
至于比较这三个向量:
identical(mpg1, mpg2, mpg3)
TRUE
all.equal(mpg1, mpg2, mpg3)
TRUE
注意:上面显示的dplyr :: collect()
函数实际上会更改mpg1的类别,从
“tbl_spark”“tbl_sql”“tbl_lazy”“tbl”
到
“tbl_df”“tbl”“data.frame”
随后在最后一步中将其转换为数字向量,即'[['('mpg')
。
嗯,看起来dplyr
的代码中有许多多余的步骤。这只是一个简单的例子!
我想知道是否可以安全地绕过dplyr
进行R内部的操作,因此我的问题是标题。
注意:我知道一个选项是SQL
查询;还有其他(更好的)方法吗?
谢谢!
dplyr
。例如,你可以使用partitions$test[['mpg']]
并提取向量。然而,由于问题涉及到是否适用于spark
接口,我不确定。但是我知道dtplyr
延迟收集以实现更高性能的 [tag:data.table] 查询。我只能期望sparklyr
也会通过惯用的dplyr
函数序列(即管道链)实现最佳性能。 - Coledataframe
(通过扩展data.table
)与基本提取器[[
一起使用。另外,我不确定您的解决方案是否按预期工作;在发布之前,我已经尝试过它,结果是“NULL”。也许在这种情况下,[[
需要更深入地挖掘(请参见str(partitions$test)
)。 - Dragos Bandurmutate
、transmute
、collect
等等,当已经有数学运算可以实现所有这些功能?此外,用这种方式编写的代码更长,对于大型数据集而言速度也较慢,并且不太容易进行故障排除。是的,我和其他人一样主观!每次阅读教程时,我希望控制我使用的工具。至于链接:请查看这里的表格。 - Dragos Bandur