通过sparklyr替换spark数据帧中的 '\\'或 '\\\\'失败

标签 r apache-spark backslash sparklyr

我尝试替换 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

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

最佳答案

您应该注意的第一件事是 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 }
}

但实际上只需翻译:

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

关于通过sparklyr替换spark数据帧中的 '\\'或 '\\\\'失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48619825/

相关文章:

php - 如何使用 PHP 从 UTF-8 数据库输出反斜杠?

r - 加速随机森林的建议

r - 向 R 条形图添加垂直分隔符和标签

java - 使用Java的Spark MLlib分类输入格式

apache-spark - 如何使用 spark 数据框评估 spark Dstream 对象

scala - mapreduce Job()抛出了 'java.lang.IllegalStateException'异常。无法评估org.apache.hadoop.mapreduce.Job.toString()

git - Pycharm 在 Git 中表现异常(树条目中的文件名包含反斜杠)

r - R 中条件对象的处理

r - 使用 ggplot 根据线条颜色设置图例

javascript - jQuery 属性等于选择器 [name=”value”] 传递以反斜杠结尾的变量时出现问题