【问题标题】:How can I use spark_apply() to generate combinations using combn()如何使用 spark_apply() 使用 combn() 生成组合
【发布时间】:2025-12-15 00:05:02
【问题描述】:

我想使用 spark 为相对较大的输入列表(200 ish)生成 combn() 函数的输出,以及 m (2-5) 的不同值,但是我遇到了麻烦包括在spark_apply()中。

我目前的方法的一个 mwe (based on this):

names_df <- data.frame(name = c("Alice", "Bob", "Cat"), 
                   types = c("Human", "Human", "Animal"))

combn(names_df$name, 2)

name_tbl <- sdf_copy_to(sc = sc,
                        x = names_df,
                        name = "name_table")

name_tbl %>%
  select(name) %>%
  spark_apply(function(e) combn(e, 2))

错误消息输出很大,但我无法理解如何使用该信息来改进我的方法。

我希望得到像 MWE 的第二行那样的输出。 combn() 期望的“矢量源”不是我提供的 select() 的问题吗?还是 select 没有返回“可强制转换为 Spark DataFrame 的对象(通常是 spark_tbl)”?无论哪种方式,有没有一种方法可以让我达到预期的效果?

我也试过这个,但没有成功:

name_tbl %>%
  select(name) %>% # removing this also doesn't work
  spark_apply(function(e) combn(e$name, 2))

编辑:所以expand.grid 工作正常,这表明combn 的返回存在一些问题,无法强制转换为data.frame。

工作expand.grid:

name_tbl %>%
  spark_apply(function(e) expand.grid(e))

编辑 2:

仔细阅读文档后,我现在还尝试将函数强制转换为 data.frame,正如它所说:

您的 R 函数应设计为在 R 数据帧上运行。传递给 spark_apply 的 R 函数需要一个 DataFrame,并将返回一个可以转换为 DataFrame 的对象。

但是,以下也没有成功:

name_tbl %>%
  spark_apply(function(e) data.frame(combn(e$name, 2)))

name_tbl %>%
  select(name) %>%
  spark_apply(function(e) data.frame(combn(e, 2)))

【问题讨论】:

  • 我刚刚找到了expand.grid() 函数。在这种特定情况下,我认为我不需要它,但我希望我会在我需要做的下一部分工作中使用它。如果可能的话,如果有一个使用 spark 来应用它的例子,我会很感兴趣

标签: r apache-spark apply sparklyr


【解决方案1】:

问题似乎是combn()不能与因子一起正常工作,代码还需要命名列,如:

name_tbl %>%
  spark_apply(
    function(e) data.frame(combn(as.character(e$name), 2)),
    names = c("1", "2", "3")
  )

# Source:   table<sparklyr_tmp_626bc0dd927> [?? x 3]
# Database: spark_connection
    `1`   `2`   `3`
  <chr> <chr> <chr>
1 Alice Alice   Bob
2   Bob   Cat   Cat

【讨论】:

  • 感谢您的解决方案,以及我知道您在该项目中所做的工作。一个小的扩展问题,因为我没有意识到需要 names 参数。为什么需要它,当输出的长度非常大时,你会如何建议提供它的值?我已经成功试用as.character(c(1:choose(3, 2)))。还有更合适的吗?
  • 此外,来自combn 的文档:“从 R 3.1.0 接受因子 x(尽管巧合的是,它们在早期版本中用于简化 = FALSE)。”所以你的意思是文档不正确/不完整,或者火花方面的幕后发生了什么阻止它使用因素?
  • 对,按照您的建议生成名称似乎是合理的。关于combn 它确实支持因子,我应该说使用因子作为输入会导致因子作为输出,强制as.character 使得combn 的结果成为matrix,可以包装为data.frame。我们需要确保spark_apply() 函数返回一个数据框,combn 可能还有其他(更好的?)方法来实现这一点。
  • 在更大规模的问题上使用了这个 IRL(180 个字符串列表的组合)我想知道是否有任何关于分发我所缺少的过程的建议?处理似乎严重偏向于运行 rstudio 的节点。
  • 你是对的。 @russellpierce,一旦我在这里实施了功能建议,该过程就会毫无错误地运行。然而,在将数据集分布在多台机器上时,随后的检查证明该函数已在每台机器内运行,但没有跨机器运行,即机器 1 具有 a、b、c 机器 2 具有 d、e、f。该过程返回 ab、ac、bc、de、df、ef 但不返回 ad、ae 或 af。我留下了标记为正确的答案,它解决了退货的技术问题,但是我应该更新这篇文章。道歉。