代码之家  ›  专栏  ›  技术社区  ›  Mouad_Seridi

唯一值Sparkyr的数目

  •  2
  • Mouad_Seridi  · 技术社区  · 6 年前

    下面的示例描述了如何在不使用dplyr和sparklyr聚合行的情况下计算不同值的数量。

    是否有一种不打破命令链的变通方法?

    一般来说,如何在SparkyR数据帧上使用类似sql的窗口函数。

    ## generating a data set 
    
    set.seed(.328)
    df <- data.frame(
      ids = floor(runif(10, 1, 10)),
      cats = sample(letters[1:3], 10, replace = TRUE),
      vals = rnorm(10)
    )
    
    
    
    ## copying to Spark
    
    df.spark <- copy_to(sc, df, "df_spark", overwrite = TRUE)
    
    # Source:   table<df_spark> [?? x 3]
    # Database: spark_connection
    #   ids  cats       vals
    # <dbl> <chr>      <dbl>
    #  9     a      0.7635935
    #  3     a     -0.7990092
    #  4     a     -1.1476570
    #  6     c     -0.2894616
    #  9     b     -0.2992151
    #  2     c     -0.4115108
    #  9     b      0.2522234
    #  9     c     -0.8919211
    #  6     c      0.4356833
    #  6     b     -1.2375384
    # # ... with more rows
    
    # using the regular dataframe 
    
    df %>% mutate(n_ids = n_distinct(ids))
    
    # ids cats       vals n_ids
    # 9    a  0.7635935     5
    # 3    a -0.7990092     5
    # 4    a -1.1476570     5
    # 6    c -0.2894616     5
    # 9    b -0.2992151     5
    # 2    c -0.4115108     5
    # 9    b  0.2522234     5
    # 9    c -0.8919211     5
    # 6    c  0.4356833     5
    # 6    b -1.2375384     5
    
    
    # using the sparklyr data frame 
    
    df.spark %>% mutate(n_ids = n_distinct(ids))
    
    Error: Window function `distinct()` is not supported by this database
    
    2 回复  |  直到 6 年前
        1
  •  6
  •   zero323 little_kid_pea    6 年前

    这里最好的方法是分别计算计数 count ˆ˜ distinct :

    n_ids <- df.spark %>% 
       select(ids) %>% distinct() %>% count() %>% collect() %>%
       unlist %>% as.vector
    
    df.spark %>% mutate(n_ids = n_ids)
    

    approx_count_distinct :

    n_ids_approx <- df.spark %>% 
       select(ids) %>% summarise(approx_count_distinct(ids)) %>% collect() %>%
       unlist %>% as.vector
    
    df.spark %>% mutate(n_ids = n_ids_approx)
    

    这有点冗长,但是 dplyr 如果要使用全局无界帧,则无论如何都是死胡同。

    如果希望得到准确的结果,还可以:

    df.spark %>% 
        spark_dataframe() %>% 
        invoke("selectExpr", list("COUNT(DISTINCT ids) as cnt_unique_ids")) %>% 
        sdf_register()
    
        2
  •  0
  •   edog429    4 年前

    我想链接 this thread 这就是Sparkyr的答案。

    我认为使用About\u count\u distinct是最好的解决方案。根据我的经验,dbplyr在使用窗口时不会转换此函数,因此最好自己编写SQL。

    mtcars_spk <- copy_to(sc, mtcars,"mtcars_spk",overwrite = TRUE)
    mtcars_spk2 <- mtcars_spk %>%
                    dplyr::mutate(test = paste0(gear, " ",carb)) %>%
                    dplyr::mutate(discnt = sql("approx_count_distinct(test) OVER (PARTITION BY cyl)"))
    

    This thread 更一般地处理该问题,并讨论CountDistinct v.s.approxCountDistinct