Databricks中SparkR与tidyverse使用出现mutate继承方法签名报错如何解决
报错触发原因
- 核心原因是包的命名空间冲突:SparkR包本身提供了
mutate、group_by、summarise等和tidyverse(dplyr)同名的函数,加载顺序导致SparkR的同名函数优先级更高,而SparkR的mutate默认仅适配Spark DataFrame对象。你已经通过as.data.frame()把Spark DataFrame转成了R原生data.frame,SparkR的mutate找不到适配原生data.frame的方法,就触发了该报错。 - 额外问题:你直接将全量Spark DataFrame转成R原生数据框的操作本身不合理,如果读入的Delta表数据量较大,会直接占满Driver节点内存,完全失去了Spark分布式计算的优势。
修复方案
分两种场景选择适配方案:
场景1:保留Spark分布式计算能力,不将全量数据拉到Driver端
直接用SparkR语法处理原生Spark DataFrame即可,无需提前转成R原生数据框,调整后代码如下:
# 读入Delta表得到Spark DataFrame Data <- read.df(source = "delta", path ='/FileStore/tables/data', header="true", inferSchema = "true") # 直接用SparkR函数做分布式计算 result <- Data %>% SparkR::mutate(month = month(RetailWeekStartingDate), year = year(RetailWeekStartingDate)) %>% SparkR::group_by(year, month) %>% SparkR::summarise(Units = sum(Units)) # 仅在需要时将聚合后的小结果拉取到Driver端转成R原生数据框 result_local <- as.data.frame(result)
注:加SparkR::前缀是为了明确指定调用SparkR命名空间下的函数,彻底规避和dplyr同名函数的冲突
场景2:数据量极小,确实需要转成R原生data.frame用tidyverse处理
明确指定调用dplyr的同名函数即可,调整后代码如下:
Data <- read.df(source = "delta", path ='/FileStore/tables/data', header="true", inferSchema = "true") df <- as.data.frame(Data) # 明确指定调用dplyr的函数 df %>% dplyr::mutate(month = lubridate::month(RetailWeekStartingDate), year = lubridate::year(RetailWeekStartingDate)) %>% dplyr::group_by(year, month) %>% dplyr::summarise(Units = sum(Units))
注:如果month和year函数也出现匹配报错,加lubridate::前缀明确调用lubridate包的日期处理函数即可
内容的提问来源于stack exchange,提问作者kcmox
相关产品推荐
相关产品推荐

