R fastdummies эквивалент в sparkR - PullRequest
0 голосов
/ 23 марта 2020

У меня есть фрейм данных Spark со следующими данными:

categories
1       John
2       Luis
3       Dora

Для которого мне нужно создать одну горячую версию как:

  categories categories_Dora categories_John categories_Luis
1       John               0               1               0
2       Luis               0               0               1
3       Dora               1               0               0

Это текущий код I have:

test <- data.frame("SN" = 1:2, "Age" = c(21,15), "Name" = c("John;Luis","Dora"))
df <- as.DataFrame(test)
df_2 = selectExpr(df, "split(Name, ';') AS categories","Name")


dat <- df_2 %>% 
 mutate(categories=explode(df_2$categories)) %>%
 select("categories")

Текущее решение, которое у меня есть, - преобразовать его в обычный R-фрейм данных и применить функцию быстрых макетов. Это работает для этого случая, но не будет работать должным образом для большого набора данных:

r_df = dat %>% 
       SparkR::collect()
dummy_r = dummy_cols(r_df)

Как получить тот же результат, используя кадры данных sparkR?

1 Ответ

1 голос
/ 03 апреля 2020

Это можно сделать с помощью Sparklyr, который имеет множество функций, доступных для преобразования функций.

library(sparklyr)

test <- data.frame("categories" = c("John", "Luis","Dora"))

sc <- sparklyr::spark_connect(master = "local")

d_tbl <- copy_to(sc, test, overwrite = TRUE)

d_tbl %>%
  ft_string_indexer(input_col = "categories", output_col = "cat_num") %>%
  mutate(cat_num = cat_num + 1) %>%
  ft_one_hot_encoder("cat_num", "cat_onehot") %>%
  sdf_separate_column("cat_onehot", 
                      paste("categories", pull(., categories), sep="_")) %>%
  select(-cat_num, -cat_onehot)

Вывод:

# Source: spark<?> [?? x 4]
  categories categories_John categories_Luis categories_Dora
  <chr>                <dbl>           <dbl>           <dbl>
1 John                     0               0               0
2 Luis                     0               1               0
3 Dora                     0               0               1

ft_string_indexer генерирует имена столбцов cat_num который имеет числовое значение c для каждой категории. Очень похоже на as.numeric(factor) в R. +1 только для индексов от 1 до N. ft_one_hot_encoder делает маги c на уровне Spark, функция возвращает векторизованное значение, как список с кодировкой. Функция sdf_separate_column расширяет кодировку до столбцов. paste генерирует имена столбцов, используя уровни категорий. select удаляет ненужные столбцы, используемые в преобразовании.

...