【问题标题】:Sparklyr fill down with stringSparklyr 用字符串填充
【发布时间】:2019-06-12 16:33:27
【问题描述】:

我想在 sparklyr 数据帧上填写值(用以前的值替换 NA),该字段包含字符串。

本质上我想改变这个:

ID, String
1    a
2    NaN
3    b
4    NaN

到这里:

ID, String
1    a
2    a
3    b
4    b

有没有办法在 sparklyr 中做到这一点?

【问题讨论】:

  • 在链接的 github 问题中,他们正在使用 cummax 为数字列解决此问题,不确定如何将此解决方案应用于字符串列。
  • 另外,我可能读错了,但它似乎假设数字将在列中上升,并且只需要最大的数字直到该点才能填充。
  • 对于像sparklyr 这样的高级API,没有直接的解决方案可以达到预期的结果并横向扩展,以防不应用分组。请注意,链接问题中的解决方案根本无法扩展,如果您采用这种方式,您也可以使用纯 R data.frame - 请参阅Avoid performance impact of a single partition mode in Spark window functions
  • 有没有办法调用可以实现这一点的函数?问题是我必须对相当多的数据(和很多组)执行此操作,如果我尝试将它带到正常的数据框,它会杀死 R。

标签: r sparklyr


【解决方案1】:

最近的包update for sparklyr 包含fill,其行为方式与同名的tidyr 函数相同。此外,我们可以查看 SQL 并直接应用 LAST 函数。在下面的示例中,我按“grp”进行分区,因为对于我自己的工作,我想对其进行分组,只需删除 group_by/PARTITION BY 即可在没有组的情况下进行。

创建表

a <- data.frame(vals = c(NA,NA,NA,1,NA,NA,NA,NA,NA,6,NA,NA,NA,10), row_num = 1:14, grp = c(1,1,1,1,1,1,1,2,2,2,2,2,2,2))
b <- copy_to(con,a,"example", overwrite = TRUE)

在 SQL 中应用回填

c <- sdf_sql(con,"
    SELECT* 
    , LAST(vals, TRUE) OVER  (PARTITION BY grp ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS last_val
    FROM example
             ")

在 sparklyr 中应用 backfull

诚然,我在使用填充功能时遇到了一些问题,但它应该是这样的。

c <- sdf_sql(con, "SELECT * FROM example")
c <- c %>% mutate(last_val = fill(val,.direction="down")

或者,您可以只在肯定有效的 mutate 中应用 SQL。

c <- sdf_sql(con, "SELECT * FROM example")
c <- c %>% mutate(last_val = sql("LAST LAST(vals, TRUE) OVER  (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)"))

【讨论】:

    【解决方案2】:

    这适用于您的示例:

    library(sparklyr)
    library(tidyverse)
    
    sc <- spark_connect(master = "local")
    
    df<-tibble(ID=c(1,2,3,4), String=c("a",NaN,"b",NaN))
    
    tbl_df<-sdf_copy_to(sc,df,"tbl_df",overwrite = TRUE)
    
    tbl_df<-tbl_df%>%mutate(String=ifelse(String=="NaN",lag(String,order = ID),String))
    
    > glimpse(tbl_df)
    Observations: ??
    Variables: 2
    $ ID     <dbl> 1, 2, 3, 4
    $ String <chr> "a", "a", "b", "b"
    

    【讨论】:

    • 这可能适用于 OP 使用的确切示例,但它不能概括,更重要的是,不能扩展。
    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 2017-11-25
    • 1970-01-01
    • 2010-10-19
    • 2016-03-13
    相关资源
    最近更新 更多