如何在sparklyr包中正确运行FPGrowth算法并解决执行报错
核心报错根因
- 找不到
mutate函数:未加载dplyr包的前提下裸写mutate,且之前尝试调用的plyr::mutate、SparkR::mutate并非sparklyr生态适配Spark DataFrame的接口,无法正确触发Spark端的列操作逻辑。 - Spark表导入冲突:多次重复运行
copy_to时未显式传入overwrite = TRUE参数,Spark会话中已存在同名临时表,未设置覆盖逻辑时就会触发导入报错,和使用哪个版本的mutate无直接关联。 - 模型入参要求:
ml_fpgrowth仅接受集合/数组类型的items列作为输入,不支持直接传入单值字符串列。
完整可执行操作流程
set.seed(123) # 构造原始本地list格式交易数据 li <- list() for(i in 1:10) li[[i]] <- make.unique(letters[sample(1:26,sample(5:20,1),rep = T)]) # 加载必要依赖,解决函数找不到的问题 library(sparklyr) library(dplyr) # 连接本地Spark集群 sc <- spark_connect(master = "local", version = "3.0.1") # 本地构造符合模型输入格式的tibble,原始list本身就是向量集合,无需额外字符串拆分 local_data <- tibble::tibble(items = li) # 导入为Spark DataFrame,*补全overwrite参数解决表重复报错* df <- copy_to( sc, local_data, name = "fp_growth_input", overwrite = TRUE ) # 训练FPGrowth关联规则模型 fp_growth_model <- ml_fpgrowth( df, items_col = "items", min_support = 0.2, min_confidence = 0.5 )
字符串格式交易数据的适配方法
如果后续使用的是空格分隔的字符串格式交易数据,按以下流程操作即可避开之前的报错:
# 构造字符串格式测试数据 str_tb <- tibble::tibble(items=c("a b c", "a b", "c f g", "b c")) # 导入Spark并做列类型转换 str_spark_df <- copy_to( sc, str_tb, name = "str_fp_input", overwrite = TRUE ) %>% # *统一使用dplyr的mutate做Spark端列操作* mutate(items = split(items, "\\s+"))
操作注意事项
- 所有Spark DataFrame的列操作必须使用dplyr接口,不要交叉调用plyr、SparkR的同名字数,避免函数冲突。
- 重复运行Spark导入逻辑时,必须在
copy_to中设置overwrite = TRUE,否则会反复触发同名表存在的报错。 - 检查输入模型的items列类型,必须是数组/集合格式,否则会触发模型入参校验报错。
内容的提问来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

