【问题标题】:Can dplyr modify multiple columns of spark DF using a vector?dplyr 可以使用向量修改多列 spark DF 吗?
【发布时间】:2018-05-24 11:01:51
【问题描述】:

我是 spark 的新手。我想将火花数据帧的大量列乘以向量中的值。到目前为止,对于 mtcars,我使用了一个 for 循环和 mutate_at,如下所示:

library(dplyr)
library(rlang)
library(sparklyr)

sc1 <- spark_connect(master = "local")

mtcars_sp = sdf_copy_to(sc1, mtcars, overwrite = TRUE)

mtcars_cols = colnames(mtcars_sp)
mtc_factors = 0:10 / 10

# mutate 1 col at a time
for (i in 1:length(mtcars_cols)) {
    # set equation and print - use sym() convert a string
    mtcars_eq = quo( UQ(sym(mtcars_cols[i])) * mtc_factors[i])
    # mutate formula - LHS resolves to a string, RHS a quosure
    mtcars_sp = mtcars_sp %>% 
        mutate(!!mtcars_cols[i] := !!mtcars_eq )
}

dbplyr::sql_render(mtcars_sp)
mtcars_sp

这适用于 mtcars。但是,它会导致嵌套的 SQL 查询被发送到 spark,如 sql_render 所示,并分解为许多列。在这种情况下,可以使用 dplyr 来代替发送单个 SQL 查询吗?

顺便说一句,我不想​​转置数据,因为它太贵了。任何帮助将不胜感激!

【问题讨论】:

    标签: r apache-spark dplyr apache-spark-sql sparklyr


    【解决方案1】:

    一般情况下,您可以通过Artem Sokolov 使用great answer

    library(glue)
    
    mtcars_sp %>% 
      mutate(!!! setNames(glue("{mtcars_cols} * {mtc_factors}"), mtcars_cols) %>% 
        lapply(parse_quosure))
    

    但是,如果这是 MLlib 算法的输入,那么 ft_vector_assembler 结合 ft_elementwise_product 可能更合适:

    scaled <- mtcars_sp %>% 
      ft_vector_assembler(mtcars_cols, "features") %>% 
      ft_elementwise_product("features", "features_scaled", mtc_factors)
    

    可以使用sdf_separate_column 将结果(如果您使用 MLlib,我不建议这样做)分成单独的列:

    scaled %>% 
      select(features_scaled) %>% 
      sdf_separate_column("features_scaled", mtcars_cols)
    

    【讨论】:

    • 谢谢!我暂时没有使用 MLlib 算法,所以第一种方法对我来说是完美的。
    猜你喜欢
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2020-01-21
    • 1970-01-01
    • 2014-12-24
    相关资源
    最近更新 更多