首页 > 解决方案 > 在 sparklyr 或 sparkR 中逐行处理表

问题描述

我在 sparklyr 中加载了一个基因表达矩阵(33000 行 x 180 个样本),我想处理探针(行)而不是样本(列)。

library(sparklyr) 
sc <- spark_connect(master = "local")
library(dplyr)
ge <- read.delim("plier-gcbg-sketch.summary.txt", 
    sep="\t", comment.char="#")
ge_tbl <- copy_to(sc, ge)

我最初的想法是申请:

mean_by_gene <- ge %>% select(-probeset_id) %>% 
   rowwise() %>% do( data.frame(M=mean(as.numeric(.))) )

但似乎 rowwise 在 sparklyr 中不可用。所以,经过一番谷歌搜索后,我申请了:

ge_tbl2 %>% select(-probeset_id) %>% 
    spark_apply(function(df) { 
        data.frame(apply(df, 1, function(x) mean(as.numeric(x)))) 
    } )

这很好用,因为它生成具有每行平均值的 data.frame。但我对此有些怀疑。

问题:

  1. 当我测试时间(使用 system.time)时,sparklyr 比标准 R 版本慢(sparklyr:0.747s、0.702s、0.731s;标准 R:0.009、0.008、0.008)。为什么?(对于测试,我只使用了 10 个探针(行))。
  2. 当我尝试计算完整矩阵(33000 行 x 180 列)而不是少量列(10~100)时,火花崩溃。我假设我没有正确处理表格,那么我该如何利用火花功能呢?

这是我获得的错误片段:

[...]
18/06/13 13:44:21 INFO sparklyr: RScript (4377) found 33297 rows
18/06/13 13:46:08 INFO sparklyr: RScript (4377) retrieved 33297 rows
18/06/13 13:46:19 INFO sparklyr: RScript (4377) computing closure
18/06/13 13:46:51 ERROR sparklyr: RScript (4377) terminated unexpectedly: invalid subscript type 'list'
18/06/13 13:46:51 ERROR sparklyr: Worker (4377) failed to complete R process
[...]

标签: rapache-sparksparkrsparklyr

解决方案


推荐阅读