Есть ли способ использовать dapply для сопоставления и замены шаблонов в нескольких столбцах фрейма данных SparkR?

#sparkr

#sparkr

Вопрос:

Запуск Spark 2.0 локально

 df <- data.frame(a = c("$0.00 ", "$601.19 ", "$601.19 ", "$238.58 "),
             b = c("$148.81 ", "$396.85", "$24.37 ", "$24.37 "),
             c = c("$238.58 ", "$211.15 ", "$422.30 ", "$150.30")
             )

ddf <- as.DataFrame(df)
  

Я хочу запустить что-то вроде этого

 ddf2 <- dapply(ddf, function(x) { regexp_replace(x, "\$|,", "")}, schema(ddf))
  

но он возвращает ошибку

 head(ddf2)
ERROR Executor: Exception in task 0.0 in stage 13.0 (TID 13)
org.apache.spark.SparkException: R computation failed with
Error in (function (classes, fdef, mtable)  : 
unable to find an inherited method for function ‘regexp_replace’ for signature ‘"data.frame", "character", "character" 

Ответ №1:

Использование dapply :

 ddf2 <- dapply(ddf, function(x) { as.data.frame(apply(x, MARGIN=2, function(y) gsub("\$|,", "", y, perl=TRUE)), stringsAsFactors = FALSE) } , schema(ddf))
  

dapply ожидает R data.frame в качестве вывода анонимной функции.

regexp_replace Метод ожидает SparkDataFrame Column в качестве входных данных.

Пример без dapply (заменяет только значения a столбца):

 withColumn(ddf,'a', regexp_replace(ddf$a, "\$|,", ""))