如何解决Sparklyr中的完整数据框
我正在尝试在sparklyr中复制tidyr:complete
函数。我有一个缺少某些值的数据框,我必须填写这些行。在dplyr / tidyr中,我可以执行以下操作:
data <- tibble(
"id" = c(1,1,2,2),"dates" = c("2020-01-01","2020-01-03","2020-01-01","2020-01-03"),"values" = c(3,4,7,8))
# A tibble: 4 x 3
id dates values
<dbl> <chr> <dbl>
1 1 2020-01-01 3
2 1 2020-01-03 4
3 2 2020-01-01 7
4 2 2020-01-03 8
data %>%
mutate(dates = as_date(dates)) %>%
group_by(id) %>%
complete(dates = seq.Date(min(dates),max(dates),by="day"))
# A tibble: 6 x 3
# Groups: id [2]
id dates values
<dbl> <date> <dbl>
1 1 2020-01-01 3
2 1 2020-01-02 NA
3 1 2020-01-03 4
4 2 2020-01-01 7
5 2 2020-01-02 NA
6 2 2020-01-03 8
但是complete
中不存在sparklyr
函数。
data_spark %>%
mutate(dates = as_date(dates)) %>%
group_by(id) %>%
complete(dates = seq.Date(min(dates),by="day"))
Error in UseMethod("complete_") :
no applicable method for 'complete_' applied to an object of class "c('tbl_spark','tbl_sql','tbl_lazy','tbl')"
是否可以设置UDF或获得类似结果?
谢谢
解决方法
内部tidyr::complete
仅执行完全连接,然后进行可选的NA填充。您可以通过使用sdf_copy_to
创建一个新的sdf来复制其效果,该新的sdf只是开始日期和结束日期之间的一列seq.Date
,然后在该日期和数据集之间执行full_join
。
这是在Spark中完成所有工作的方法。
library(sparklyr)
sc <- spark_connect(master = "local")
data <- tibble(
id = c(1,1,2,2),dates = c("2020-01-02","2020-01-04","2020-01-01","2020-01-03"),values = c(1,3,4)
)
data_spark <- copy_to(sc,data)
我们需要生成dates
和id
的所有组合。为此,我们需要知道总天数和首次约会。
days_info <-
data_spark %>%
summarise(
first_date = min(dates),total_days = datediff(max(dates),min(dates))
) %>%
collect()
days_info
#> # A tibble: 1 x 2
#> first_date total_days
#> <chr> <int>
#> 1 2020-01-01 3
sdf_seq
可用于在Spark中生成序列。可以用来获取dates
和id
的组合。
dates_id_combinations <-
sdf_seq(
sc,from = 0,to = days_info$total_days,repartition = 1
) %>%
transmute(
dates = date_add(local(days_info$first_date),id),join_by = TRUE
) %>%
full_join(data_spark %>% distinct(id) %>% mutate(join_by = TRUE)) %>%
select(dates,id)
dates_id_combinations
#> # Source: spark<?> [?? x 2]
#> dates id
#> <date> <dbl>
#> 1 2020-01-01 1
#> 2 2020-01-01 2
#> 3 2020-01-02 1
#> 4 2020-01-02 2
#> 5 2020-01-03 1
#> 6 2020-01-03 2
#> 7 2020-01-04 1
#> 8 2020-01-04 2
full_join
原始数据帧和组合数据帧。然后根据每个组的min
/ max
日期进行过滤。
data_spark %>%
group_by(id) %>%
mutate(first_date = min(dates),last_date = max(dates)) %>%
full_join(dates_id_combinations) %>%
filter(dates >= min(first_date),dates <= max(last_date)) %>%
arrange(id,dates) %>%
select(id,dates)
#> # Source: spark<?> [?? x 2]
#> # Groups: id
#> # Ordered by: id,dates
#> id dates
#> <dbl> <chr>
#> 1 1 2020-01-02
#> 2 1 2020-01-03
#> 3 1 2020-01-04
#> 4 2 2020-01-01
#> 5 2 2020-01-02
#> 6 2 2020-01-03
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。