Найти переменные, создающие первичный ключ, используя SparkR - PullRequest
0 голосов
/ 15 ноября 2018

Вот мои данные игрушки:

df <- tibble::tribble(
  ~var1, ~var2, ~var3, ~var4, ~var5, ~var6, ~var7,
    "A",   "C",    1L,    5L,  "AA",  "AB",    1L,
    "A",   "C",    2L,    5L,  "BB",  "AC",    2L,
    "A",   "D",    1L,    7L,  "AA",  "BC",    2L,
    "A",   "D",    2L,    3L,  "BB",  "CC",    1L,
    "B",   "C",    1L,    8L,  "AA",  "AB",    1L,
    "B",   "C",    2L,    6L,  "BB",  "AC",    2L,
    "B",   "D",    1L,    9L,  "AA",  "BC",    2L,
    "B",   "D",    2L,    6L,  "BB",  "CC",    1L)

Мой оригинальный вопрос по следующей ссылке https://stackoverflow.com/a/53110342/6762788 был:

Как я могу получить комбинацию из минимального числапеременные, которые однозначно определяют наблюдения в кадре данных, т.е. какие переменные вместе могут сделать первичный ключ?Следующий ответ / код работает абсолютно нормально, большое спасибо thelatemail .

nms <- unlist(lapply(seq_len(length(df)), combn, x=names(df), simplify=FALSE), rec=FALSE)
out <- data.frame(
  vars = vapply(nms, paste, collapse=",", FUN.VALUE=character(1)),
  counts = vapply(nms, function(x) nrow(unique(df[x])), FUN.VALUE=numeric(1))
)

Теперь, чтобы заставить его работать с большими данными, я хочу передать это в SparkR.Используя этот ответ, кто-нибудь может помочь мне перевести этот код в SparkR?Если это сложно в SparkR, то в sparklyr.

1 Ответ

0 голосов
/ 21 декабря 2018

Я разбил вышеупомянутую проблему на мелкие кусочки и попробовал следующий код SparkR. Тем не менее, строка «count <- lapply (nms, ...» кажется очень медленной. Используя этот код, вы можете предложить дальнейшее улучшение производительности, возможно, путем обновления «count <- lapply (nms, ...») линия. </p>

library(SparkR); library(tidyverse)

df_spark <- mtcars %>% as.DataFrame()

num_m <- seq_len(ncol(df_spark))

nam_list <- SparkR::colnames(df_spark)

combinations <- function(num_m) {
  combn(num_m, x=nam_list, simplify=FALSE)
}

nms <- spark.lapply(num_m, combinations) %>% unlist(rec=FALSE)

vars = map_chr(nms, ~paste(.x, collapse = ","))

counts <- lapply(nms, function(x) df_spark %>% SparkR::select(x) %>% SparkR::distinct() %>% SparkR::count()) %>% unlist()

out <- data.frame(
  vars = vars,
  counts = counts
)

primarykeys <- out %>% 
  dplyr::mutate(n_vars = str_count(vars, ",")+1) %>% 
  dplyr::filter(counts==nrow(df)) %>% 
  dplyr::filter(n_vars==min(n_vars))

primarykeys
...