【问题标题】:Can `data.table` be used safely instead of `dplyr` with `sparkR`, `sparklyr` and `rsparkling`?`data.table` 可以安全地使用`sparkR`、`sparklyr` 和 `rsparkling` 来代替 `dplyr` 吗?
【发布时间】:2020-11-13 18:44:16
【问题描述】:

我正在使用 RStudio Spark Extensions 作为来源之一刷新我的 H2O on Spark 知识。

坦率地说,无论在哪里,我都发现 dplyr 为得出即使是最简单的结果所做的不必要的复杂努力,在大多数情况下如果不是不透明的话,也是相当痛苦的。

这是一个取自网站的示例。 mtcars 数据集已被复制到名为 mtcars_tblSpark 集群中,然后对 100 hp 以上的汽车进行子集/过滤, “tbl_spark”、“tbl_sql”、“tbl_lazy”、“tbl” - 类表是 拆分为 traintest 子集,包含在 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 基础代码包装导致不透明:我喜欢我的代码说出它的功能,但它很复杂。为什么需要mutatetransmutecollect 等,而所有这些都已经有了数学运算?此外,以这种方式编写的代码更长,而且对于大型数据集来说通常更慢。对故障排除也不是很友好。是的,我和其他人一样主观!我想控制每次阅读教程时使用的工具。截至链接:check the table here

标签: r dataframe data.table


【解决方案1】:

为什么不使用pull(partitions$test, mpg)?您的方法不是执行此操作的惯用 dplyr 方式,因此让您感到沮丧也就不足为奇了。

Spark 没有data.table 接口。如果您愿意,可以使用 Spark SQL。 sparklyr 只是在后台生成 Spark SQL。

您当然没有义务使用dplyr,但我鼓励您在完全忽略它之前先熟悉它的语法 - 可能有更简洁的方法来处理您觉得令人沮丧的事情。

【讨论】:

  • @bcarlsen 谢谢回复!我不是在寻找光顾的演讲,而是寻找绕过 dplyr 的建设性方法,而不是寻找“惯用的 dplyr 方式”来操作。我知道 SQL 替代方案,并且我熟悉 dplyr 语法。
  • 我不打算光顾。在 R 中使用 dplyr 语法的替代方法是 Spark SQL。 Spark 没有使用 base 或 data.table 语法的 R 转换层。
  • @bcarlsed 我没说你打算光顾!
猜你喜欢
  • 2017-03-27
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 2011-01-02
  • 2019-07-14
相关资源
最近更新 更多