data.table
은 유용한 가치를 제공하는 rleid
기능을 제공합니다. 감시되는 변수가 변경되고 다른 변수에 의해 순서가 바뀌면 시세표 역할을합니다.sparklyr의 런 길이 ID
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
원하는 결과는 내가 sparklyr
에서 제공하는 도구를 사용하여 비슷한 재현 할 수 있는지 궁금
> 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
입니다. 테스트 할 때, 필자는 필자가 채우기를해야 할 시점까지 도달 할 수 있다고 생각했지만 달성 할 수 없었습니다. 내가 SparkR
를 사용하려고했습니다
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>
그러나 나는 많은 sparklyr
인터페이스와 사용의 편리 성을 선호하는, 그래서 이상적으로 스파크 SQL에서이 작업을 수행 할 수있을 것입니다.
데이터를 충분히 작은 청크로 분할하고, 기능을 실행하고 다시 전송함으로써 이미 수행 할 수 있습니다.
문맥 상, rleid
이 유용하다는 것을 알게 된 이유는 많은 열차 데이터로 작업한다는 것이고, 실행중인 항목에 대해 색인을 생성하는 것이 유용하다는 것입니다. 어떤 도움
감사 아킬
을 나는 당신이 사용할 수 있다고 생각 : 'TBL %> % mutate (rleid = (var! = lag (var, 1, default = "asdf"))) %> % mutate (rleid = cumsum (rleid))'기본적으로이 해결책입니다 : http://stackoverflow.com/a/33510765/2026277 –
@JaimeCaffarel 나는 그것을하기위한 깔끔한'cumsum '방법을 알아 채지 못했습니다 ... 불행히도'cumsum'은 Spark-SQL에서 작동하지 않습니다 (또는 적어도 작동시키지 못하는 것 같습니다). % 돌연변이 체 (rleid = cumsum (rleid))는 다음과 같이 나타낼 수 있습니다 : % 돌연변이 체 (rleid = cumsum (rleid)) ' –
OH! 내가 틀렸어. 그냥 먼저 boolean을 int로 캐스팅해야했습니다. 감사! 답변을 추가하고 받아 들일 수 있습니다. 다시 한 번 감사합니다 –