PySpark中StringType转ArrayType解决FPGrowth运行报错问题
解决PySpark FPGrowth输入列类型不匹配的问题
这个错误指向很明确——FPGrowth算法要求itemsCol指定的列必须是ArrayType(数组类型),因为它要处理的是每个样本对应的项集合,而你的name列目前是StringType(字符串类型),所以才会抛出这个参数校验错误。
下面分两种常见场景给你针对性的解决方案:
场景1:每个字符串是单个独立项,转成单元素数组
如果你的name列每个值都是单独的项(比如每行就是一个单独的商品名称),只需要把字符串包装成包含该元素的数组即可,用array函数实现:
from pyspark.sql.functions import array # 将name列转换为ArrayType,也可以选择创建新列(比如命名为items) df = df.withColumn("name", array("name"))
场景2:字符串是用分隔符拼接的多个项,分割成数组
如果name列的字符串是用逗号、空格这类分隔符组合的多个项(比如"牛奶,面包,鸡蛋"),就用split函数按对应分隔符拆分:
from pyspark.sql.functions import split # 这里假设分隔符是逗号,记得根据你的实际数据调整分隔符内容 df = df.withColumn("name", split(df["name"], ","))
转换后重新运行FPGrowth
完成列类型转换后,再执行你的FPGrowth代码就可以正常运行了:
from pyspark.ml.fpm import FPGrowth fpGrowth = FPGrowth(itemsCol="name", minSupport=0.5, minConfidence=0.6) model = fpGrowth.fit(df) # 可以查看生成的频繁项集和关联规则 model.freqItemsets.show() model.associationRules.show()
转换后建议用df.printSchema()确认name列的类型已经变成array<string>,确保转换操作生效。
内容的提问来源于stack exchange,提问作者Jerry George
相关产品推荐
相关产品推荐

