3

如果这类问题无法用 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"))

事情奏效。一些帮助?

4

2 回答 2

11

可能值得补充的是,可用的文档指出:

蜂巢功能

Hive 的许多内置函数 (UDF) 和内置聚合函数 (UDAF) 都可以在 dplyr 的 mutate 和 summarise 中调用。语言参考UDF页面提供了可用函数的列表。

蜂巢

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

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

sparklyr方法

考虑到上述情况,应该可以将sparklyr管道与 应用到所需的列上regexp_replace实现同源的效果。gsub删除变量中-字符的测试代码可以构建如下:sparklyrd

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

哪里class(aDataFrame )返回:"tbl_spark" ...

于 2017-05-11T08:20:25.213 回答
3

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

于 2016-10-27T19:22:35.147 回答