sparklyr

时间:2017-02-11 11:30:10

标签: r apache-spark-sql sparklyr

data.table提供了一个rleid函数,我发现它非常有用 - 当一个观察到的变量发生变化时,它会作为一个自动收报机,由一些其他变量排序。

library(dplyr)


tbl = tibble(time = as.integer(c(1, 2, 3, 4, 5, 6, 7, 8)), 
             var  = c("A", "A", "A", "B", "B", "A", "A", "A"))

> tbl
# A tibble: 8 × 2
   time   var
  <int> <chr>
1     1     A
2     2     A
3     3     A
4     4     B
5     5     B
6     6     A
7     7     A
8     8     A

期望的结果是

> tbl %>% mutate(rleid = data.table::rleid(var))
# A tibble: 8 × 3
   time   var rleid
  <int> <chr> <int>
1     1     A     1
2     2     A     1
3     3     A     1
4     4     B     2
5     5     B     2
6     6     A     3
7     7     A     3
8     8     A     3

我想知道我是否可以使用sparklyr提供的工具重现类似内容。在测试时,我发现我能做的最好的事情是达到我需要进行填充的程度,但是后来无法实现。

library(sparklyr)

spark_install(version = "2.0.2")
sc <- spark_connect(master = "local", 
                    spark_home = spark_home_dir())


spk_tbl = copy_to(sc, tbl, overwrite = TRUE)

spk_tbl %>% 
  mutate(var2 = (var != lag(var, 1L, order = time))) %>%  # Thanks @JaimeCaffarel
  mutate(var3 = if(var2) { paste0(time, var) } else { NA })

Source:   query [8 x 4]
Database: spark connection master=local[4] app=sparklyr local=TRUE

   time   var  var2  var3
  <int> <chr> <lgl> <chr>
1     1     A  TRUE    1A
2     2     A FALSE  <NA>
3     3     A FALSE  <NA>
4     4     B  TRUE    4B
5     5     B FALSE  <NA>
6     6     A  TRUE    6A
7     7     A FALSE  <NA>
8     8     A FALSE  <NA>

我尝试使用SparkR,但我更喜欢sparklyr界面及其易用性,所以我理想情况下可以在Spark SQL中执行此操作。

我当然可以通过将数据划分为足够小的块,collect,运行函数并将其发回来来实现。

对于上下文,我发现rleid有用的原因是我使用了大量的训练数据,并且能够对运行它的内容进行索引是有用的。

感谢您的帮助 AKHIL

2 个答案:

答案 0 :(得分:1)

sparklyr中的工作解决方案是:

spk_tbl %>% 
  dplyr::arrange(time) %>% 
  dplyr::mutate(rleid = (var != lag(var, 1, order = time, default = FALSE))) %>% 
  dplyr::mutate(rleid = cumsum(as.numeric(rleid)))

答案 1 :(得分:0)

试试这个:

tbl %>% mutate(run = c(0,cumsum(var[-1L] != var[-length(var)])))
# A tibble: 8 × 3
   time   var   run
  <int> <chr> <dbl>
1     1     A     0
2     2     A     0
3     3     A     0
4     4     B     1
5     5     B     1
6     6     A     2
7     7     A     2
8     8     A     2