R 唯一值的数目
下面的示例描述了如何在不使用dplyr和sparklyr聚合行的情况下计算不同值的数量 是否有一个不打破命令链的工作环境 更一般地说,如何在数据帧上使用类似sql的窗口函数R 唯一值的数目,r,apache-spark,dplyr,apache-spark-sql,sparklyr,R,Apache Spark,Dplyr,Apache Spark Sql,Sparklyr,下面的示例描述了如何在不使用dplyr和sparklyr聚合行的情况下计算不同值的数量 是否有一个不打破命令链的工作环境 更一般地说,如何在数据帧上使用类似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(1
## 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
生成数据集
种子(.328)
df%变异(n_id=n_distinct(id))
错误:此数据库不支持窗口函数'distinct()'
这里最好的方法是单独计算计数,或者使用
count
∘ <代码>不同的:
n_ids <- df.spark %>%
select(ids) %>% distinct() %>% count() %>% collect() %>%
unlist %>% as.vector
df.spark %>% mutate(n_ids = n_ids)
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()
我想链接,在其中回答这一点为你
我认为使用近似计数法是最好的解决方案。根据我的经验,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)"))
mtcars\u spk%
dplyr::mutate(discnt=sql(“近似计数(测试)超过(按循环划分)”)
更一般地探讨这个问题,并讨论CountDistinct v.s.approxCountDistinct您不能使用
length(unique(ids))
不幸的是,它不是data.frame
对象,它是tbl_spark
对象。因此,基本上您希望过滤重复的记录,并为每个记录计算重复的数量,对吗?不,我想数一数唯一id的数量,将其用作后续计算的分母。我没有在这台电脑上安装Spark,但我考虑了一个提示和一种可能的方法。提示:df.spark%>%spark\u应用(函数(e)nrow(e),name=“n”)
。可能的方法:df.spark%>%spark\u apply(nrow,group\u by=“ids”)
这方面有什么变化吗?Sparkyr没有实现这样一个基本的sql函数,这似乎很奇怪。@Mouad_SSparkyr
依赖于一个相当简单的sql转换层。即使它“起作用”,实际的性能成本也是不可接受的(使用聚合的mutate is translate-dbplyr::translate\u sql(n_distinct(ids))
->COUNT(distinct“ids”)OVER()
。