如果这种问题无法通过闪光点解决,我会感到非常惊讶:
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"))
事情有效。一些帮助?
答案 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}}回到火花。