【发布时间】:2020-11-13 18:44:16
【问题描述】:
我正在使用 RStudio Spark Extensions 作为来源之一刷新我的 H2O on Spark 知识。
坦率地说,无论在哪里,我都发现 dplyr 为得出即使是最简单的结果所做的不必要的复杂努力,在大多数情况下如果不是不透明的话,也是相当痛苦的。
这是一个取自网站的示例。 mtcars 数据集已被复制到名为 mtcars_tbl 的 Spark 集群中,然后对 100 hp 以上的汽车进行子集/过滤,
“tbl_spark”、“tbl_sql”、“tbl_lazy”、“tbl” - 类表是
拆分为 train 和 test 子集,包含在 2 组件列表中。
列表名称是'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”以适应各种汽车重量和气缸配置。
在某些时候 - 出于预测目的 - 需要从 test 子集中选择(隔离)列“mpg”并将其用作数字向量。
这是为一个简单的操作实现的dplyr 代码:
mpg1 <- partitions$test %>%
select(mpg) %>%
collect() %>%
`[[`("mpg")
...这里是data.table 代码清晰、紧凑和简单地应用于“分区”列表:
mpg2 <- as.data.frame(partitions$test)[['mpg']]
mpg3 <- as.data.table(partitions$test)[['mpg']]
注意:如果这两个子集从一开始就被视为dataframes 或data.tables,代码会更加整洁。
比较三个向量:
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懒惰地收集以提高性能data.table 查询。我只能期望sparklyr也将是最常用的dplyr功能序列(即管道链)。 -
@科尔:谢谢你的评论!我可能还没有说清楚:我认为多余的不仅仅是管道操作员。诸如“Spark 没有 data.table 接口”之类的评论默认忽略了这样一个事实 - 正如我的示例所示 -
dataframe(扩展名为data.table)与一起使用基础提取器[[。另一方面,我不确定您的解决方案是否按预期工作;我在发布之前尝试过它,结果是“NULL”。也许[[在这种情况下需要挖北斗(见str(partitions$test)) -
它是的信息,它只是不适合解决方案。另见github.com/Rdatatable/data.table/issues/1828。与此相关的是
as.data.table()的dtplyr方法收集并执行查询。根据您的发现,sparklyrinterface 可能是这样。无论如何,正如您对可能光顾 cmets 感到沮丧一样,请反思您自己的 cmets。请注意,您没有说明您不喜欢 dplyr 代码的(主观)原因,让其他人猜测。我是作为 data.table 爱好者这么说的。 -
@Cole 我想我确实指出了原因:不必要的 R 基础代码包装导致不透明:我喜欢我的代码说出它的功能,但它很复杂。为什么需要
mutate、transmute、collect等,而所有这些都已经有了数学运算?此外,以这种方式编写的代码更长,而且对于大型数据集来说通常更慢。对故障排除也不是很友好。是的,我和其他人一样主观!我想控制每次阅读教程时使用的工具。截至链接:check the table here
标签: r dataframe data.table