使用 SparkR 查找创建主键的变量

Posted

技术标签:

【中文标题】使用 SparkR 查找创建主键的变量【英文标题】:Find variables making Primary Key using SparkR 【发布时间】:2019-04-18 23:19:03 【问题描述】:

这是我的玩具数据:

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://***.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。

【问题讨论】:

这是一个相当广泛的问题,特别是因为没有一个链接的蛮力解决方案可以扩展。你做过研究吗?任何尝试解决这个问题?启发式地,您可以使用 Count-min 草图结合一些独立性度量来构建贪心算法。 我最近学习了 SparkR,但发现很难使用它重新创建解决方案。它帮助我理解任何中小型数据的粒度。我应该如何使用 count-min 草图和您建议的其他东西? 考虑遵循启发式 - 找到一个具有最高基数的列 - 如果它等于您完成的 N,否则从其余列中添加一个具有最高基数的列,依此类推...重复直到找到解决方案。然后,您可以通过不仅基于基数而且还基于与候选键中已有列的独立性做出选择来扩展它。 【参考方案1】:

我将上述问题分解成小块并尝试了以下 SparkR 代码。但是,“counts

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

【讨论】:

以上是关于使用 SparkR 查找创建主键的变量的主要内容,如果未能解决你的问题,请参考以下文章

Django 啥时候查找外键的主键?

使用 Cloudformation 创建具有复合主键的 DynamoDB

使用 jOOQ 创建具有主键的表

SQL Server 使用没有主键的聚集索引创建表

数据库表中主键的设置

如何使用 SQLAlchemy 创建一个不是主键的标识列?