В Spark SQL нет factors
или эквивалентных типов.Вместо этого, при необходимости, преобразователи Spark ML добавляют специальные метаданные столбцов.
В результате вызов factor
интерпретируется как удаленные функции и передается через механизм перевода SQL, что приводит к полной бессмысленности.
ТеперьПредполагая, что вы действительно хотите пойти с Бакетизером, вам придется сгруппировать
splits <- c(0, 15, 25, 80, 120)
bucketized <- rd_3 %>%
ft_bucketizer("visit_duration", "Visit_Category", splits = splits)
, создать справочную таблицу:
ref <- copy_to(sc, tibble(
Visit_Category = seq_along(splits[-1]) - 1,
label = paste0(
splits[-length(splits)],
"-",
splits[-1]
)
))
и присоединиться:
bucketized %>% left_join(ref, by = "Visit_Category")
# Source: spark<?> [?? x 4]
visit_duration city Visit_Category label
<dbl> <chr> <dbl> <chr>
1 12 X 0 0-15
2 20 X 1 15-25
3 70 X 2 25-80
4 100 X 3 80-120
Хотя может быть проще просто создать CASE WHEN
выражение, подобное этому:
library(rlang)
expr <- purrr::map2(
splits[-length(splits)], splits[-1],
function(lo, hi)
glue::glue("visit_duration %BETWEEN% {lo} %AND% {hi} ~ '{lo}-{hi}'")
) %>%
glue::glue_collapse(sep=",\n") %>%
paste("case_when(\n", ., ")")
rd_3 %>% mutate(result = !!parse_quo(expr, env = caller_frame()))
# Source: spark<?> [?? x 4]
visit_duration city visit_category result
<dbl> <chr> <chr> <chr>
1 12 X 0-15 0-15
2 20 X 15-25 15-25
3 70 X 25-80 25-80
4 100 X 80-120 80-120
или просто взять декартово произведение со ссылкой и отфильтровать результаты:
ref2 <- copy_to(sc, tibble(
lo = splits[-length(splits)],
hi = splits[-1]
))
cross_join(rd_3, ref2, explicit=TRUE) %>%
filter(visit_duration >= lo & visit_duration < hi) %>%
mutate(label = paste0(lo, "-", hi)) %>%
select(-lo, -hi)
# Source: spark<?> [?? x 6]
visit_duration city visit_category lo hi label
<dbl> <chr> <chr> <dbl> <dbl> <chr>
1 12 X 0-15 0 15 0.0-15.0
2 20 X 15-25 15 25 15.0-25.0
3 70 X 25-80 25 80 25.0-80.0
4 100 X 80-120 80 120 80.0-120.0