使用SparkR分组百分位数

时间:2018-08-28 02:12:40

标签: r apache-spark sparkr

我想使用SparkR计算分组百分位数。我尝试过了

library(SparkR)
mtcars_spark %>% 
      SparkR::groupBy("cyl") %>%
      SparkR::summarize(p75 = approxQuantile("mpg", 0.75, 0.01),
                        p90 = approxQuantile("mpg", 0.90, 0.01),
                        p99 = approxQuantile("mpg", 0.99, 0.01))

...但是,出现此错误:

unable to find an inherited method for function ‘approxQuantile’ for signature ‘"GroupedData", "character", "numeric", "numeric"’

如何使用SparkR获取分组的百分位数,以使所需的输出与以下代码相同:

library(dplyr)
mtcars %>% 
  group_by(cyl) %>% 
  summarise(p75 = quantile(mpg, 0.75),
            p90 = quantile(mpg, 0.90),
            p99 = quantile(mpg, 0.99))

1 个答案:

答案 0 :(得分:1)

approxQuantile是在Datasets上运行的方法-它没有在*GroupedDataset上运行的变体。如果启用了Hive支持,则使用Hive的percentile UDF:

mtcars_spark %>% 
    SparkR::groupBy("cyl") %>%
    SparkR::summarize(p75 = expr("percentile(mpg, 0.75)"),
                      p90 = expr("percentile(mpg, 0.90)"),
                      p99 = expr("percentile(mpg, 0.99)"))

否则,您可以尝试使用gapply函数,但是效率可能会低得多。