使用 Spark 将函数中的多个列名传递给 dplyr::distinct() 火花

问题描述

我想在将使用 dplyr::distinct()函数中指定未知数量的列名。我目前的尝试是:

myFunction <- function(table,id) {
  table %>%
    dplyr::distinct(.data[[id]])
}

我正在尝试上述 [.data[[id]]],因为 the data-masking section of this dplyr blog 指出:

当你有一个字符向量的环境变量时,你需要用 [[ 索引到 .data 代词,比如 summarise(df,mean = mean(.data[[var]]))。>

dplyr::distinct() 的文档说明了它的第二个参数:

<data-masking> 确定唯一性时使用的可选变量。如果给定的输入组合有多行,则只会保留第一行。如果省略,将使用所有变量。

火花

更具体地说,我正在尝试将此函数与 Spark 结合使用。

sc <- sparklyr::spark_connect(local = "master")
mtcars_tbl <- sparklyr::copy_to(sc,mtcars,"mtcars_spark")

##### desired return
mtcars_tbl %>% dplyr::distinct(cyl,gear)
# Source: spark<?> [?? x 2]
    cyl  gear
  <dbl> <dbl>
1     6     4
2     4     4
3     6     3
4     8     3
5     4     3
6     4     5
7     8     5
8     6     5

##### myFunction fails
id = c("cyl","gear")
myFunction(mtcars_tbl,id)
 Error: Can't convert a call to a string
Run `rlang::last_error()` to see where the error occurred. 

this comment 之后,我还有其他尝试失败:

myFunction <- function(table,id) {
    table %>%
        dplyr::distinct(.dots = id)
}

myFunction(mtcars_tbl,id)
# Source: spark<?> [?? x 1]
  .dots           
  <list>          
1 <named list [2]>


#####


myFunction <- function(table,id) {
    table %>%
        dplyr::distinct_(id)
}

myFunction(mtcars_tbl,id)
Error in UseMethod("distinct_") : 
  no applicable method for 'distinct_' applied to an object of class "c('tbl_spark','tbl_sql','tbl_lazy','tbl')"

解决方法

Distinct 一次应用于表的所有列。考虑一个示例表:

A     B
1     4
1     4
2     3
2     3
3     3
3     5

目前尚不清楚将 distinct 应用于列 A 而不是列 B 应该返回什么。下面的例子显然不是一个好的选择,因为它打破了 A 列和 B 列之间的关系。例如,原始数据集中没有 (A = 2,B = 4) 行。

A     B
1     4
2     4
3     3
      3
      3
      5

因此,最好的方法是先只选择您想要的那些列,然后再选择不同的列。更像是:

myFunction <- function(table,id) {
  table %>%
    dplyr::select(dplyr::all_of(id)) %>%
    dplyr::distinct()
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...