【问题标题】:sparklyr: create new column with mutate functionsparklyr:使用 mutate 函数创建新列
【发布时间】:2017-03-10 04:42:17
【问题描述】:

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

一切正常。有什么帮助吗?

【问题讨论】:

    标签: r apache-spark sparklyr


    【解决方案1】:

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

    Hive 函数

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

    蜂巢

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

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

    sparklyr接近

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

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

    class(aDataFrame ) 返回的位置:"tbl_spark" ...

    【讨论】:

    • regexp_replace 是 sparkrlyr 函数吗?我只能在 SparkR 中找到它。
    • @dallilogm regexp_replace 这是一个 Hive 函数,因为提供的解决方案使用了 Hive 的函数。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 2023-01-29
      • 2018-08-21
      • 1970-01-01
      相关资源
      最近更新 更多