【问题标题】:Replacing '\\' or '\\\\' in spark dataframe via sparklyr fails通过 sparklyr 替换 spark 数据框中的 '\\' 或 '\\\\' 失败
【发布时间】:2018-07-15 03:31:55
【问题描述】:

我尝试替换 spark 数据框中的反斜杠。我写了一个与 R 数据框配合得很好的函数。我将它插入spark_apply 并不起作用:

rm(back_slash_replace_func)

back_slash_replace_func <- function(x)
{

     cbind.data.frame(
          lapply(
          x, function(x) { if(class(x) == 'character'){ gsub(pattern = "\\", replacement = "/", x = x, fixed = T)} else { x } }
            )
     , stringsAsFactors = F
     )

}

## do in R

x <- data.frame(x = rep('\\', 10), stringsAsFactors = F)

back_slash_replace_func(x)

## do in spark

r_spark_connection <- spark_connect(master = "local")

xsp <- copy_to(r_spark_connection, x, overwrite = T)

start <- Sys.time()

spark_apply(
               x = xsp
               , f = back_slash_replace_func
               , memory = F
               )

Sys.time() - start

它不做这项工作,没有错误,没有警告。可能是什么情况?

【问题讨论】:

    标签: r apache-spark backslash sparklyr


    【解决方案1】:

    您应该注意的第一件事是,copy_to 使您的数据格式错误。而x 是:

    x %>% head(1)
    #    x
    # 1 \\
    

    xsp

    xsp %>% head(1)
    # # Source:   lazy query [?? x 1]
    # # Database: spark_connection
    #   x    
    #   <chr>
    # 1 "\"" 
    

    这是因为当您使用copy_to 时,spakrlyr 会将数据转储到平面文件中。结果它甚至无法在本地工作:

    xsp %>% collect %>% back_slash_replace_func %>% head(1)
    #   x
    # 1 "
    

    如果您直接创建数据框:

    df <-spark_session(r_spark_connection) %>%
      invoke("sql", "SELECT '\\\\' AS x FROM range(10)") %>% 
      sdf_register() 
    
    df %>% collect %>% back_slash_replace_func %>% head(1)
    #   x
    # 1 /
    

    不会出现这个特殊问题。

    这里的另一个问题是,spark_apply 实际上将strings 转换为factors(根据Kevin's 的评论,这是由sparklyr:1295 跟踪的)所以而不是:

    function(x) {
      if (is.character(x)) {
        gsub(pattern = "\\", replacement = "/", x = x, fixed = T)
      } else { x }
    }
    

    你宁愿需要:

    function(x) {
      if (is.factor(x)) {
        gsub(pattern = "\\", replacement = "/", x = as.character(x), fixed = T)
      } else { x }
    }
    

    但实际上只是translate:

    df %>% mutate(x = translate(x, "\\\\", "/")) %>% head(1)
    # # Source:   lazy query [?? x 1]
    # # Database: spark_connection
    #   x    
    #   <chr>
    # 1 /   
    

    【讨论】:

      猜你喜欢
      • 2018-01-16
      • 2018-01-12
      • 2021-06-22
      • 1970-01-01
      • 2018-01-19
      • 2017-07-20
      • 1970-01-01
      • 2018-06-25
      • 1970-01-01
      相关资源
      最近更新 更多