sparklyr:使用mutate函数创建新列

时间:2016-10-27 13:15:51

标签: r apache-spark sparklyr

如果这种问题无法通过闪光点解决,我会感到非常惊讶:

iris_tbl <- copy_to(sc, aDataFrame)

# date_vector is a character vector of element
# in this format: YYYY-MM-DD (year, month, day)
for (d in date_vector) {
   ...
   aDataFrame %>% mutate(newValue=gsub("-","",d)))
   ...
}

我收到此错误:

Error: org.apache.spark.sql.AnalysisException: Undefined function: 'GSUB'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.; line 2 pos 86
    at org.apache.spark.sql.catalyst.catalog.SessionCatalog.failFunctionLookup(SessionCatalog.scala:787)
    at org.apache.spark.sql.hive.HiveSessionCatalog.lookupFunction0(HiveSessionCatalog.scala:200)
    at org.apache.spark.sql.hive.HiveSessionCatalog.lookupFunction(HiveSessionCatalog.scala:172)
    at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$$anonfun$apply$13$$anonfun$applyOrElse$6$$anonfun$applyOrElse$39.apply(Analyzer.scala:884)
    at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$$anonfun$apply$13$$anonfun$applyOrElse$6$$anonfun$applyOrElse$39.apply(Analyzer.scala:884)
    at org.apache.spark.sql.catalyst.analysis.package$.withPosition(package.scala:48)
    at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveFunctions$$anonfun$apply$13$$anonfun

但是这一行:

aDataFrame %>% mutate(newValue=toupper("hello"))
事情有效。一些帮助?

2 个答案:

答案 0 :(得分:9)

可能值得补充的是,可用的文档说明:

  

Hive功能

     

许多Hive的内置函数(UDF)和内置聚合函数(UDAF)都可以在dplyr的mutate中进行调用和汇总。 Languange Reference UDF页面提供了可用功能列表。

蜂房

正如文档中所述,使用regexp_replace应该可以实现可行的解决方案:

  

返回替换所有子串的结果   INITIAL_STRING与定义的java正则表达式语法匹配   在PATTERN中,REPLACEMENT.的实例,例如,   regexp_replace("foobar", "oo|ar", "")返回'fb.'请注意一些   在使用预定义的字符类时需要小心:使用'\s'作为   第二个参数将匹配字母s; '\\s'是必要的   匹配空白等。

sparklyr接近

考虑到上述情况,应该可以将sparklyr管道与...结合起来 regexp_replace以实现同意gsub在所需列上的效果。已删除 - 变量sparklyr d 字符的经过测试的代码可按以下方式构建:

aDataFrame %>% 
  mutate(clnD = regexp_replace(d, "-", "")) %>%
  # ...

class(aDataFrame )返回的地方:"tbl_spark" ...

答案 1 :(得分:2)

我强烈建议您在继续之前阅读sparklyr文档。特别是,您将要阅读有关R如何转换为SQL(http://spark.rstudio.com/dplyr.html#sql_translation)的部分。简而言之,可以在sparklyr数据帧上使用非常有限的R函数子集,gsub不是这些函数之一(但toupper是)。如果您真的需要gsub,那么您需要将collect数据放入本地数据框,然后gsub它(您仍然可以使用mutate),然后{ {1}}回到火花。