Spark传入动态列数组到VectorAssembler的setInputCols报错如何解决
问题原因
首先可以排除参数类型问题:VectorAssembler.setInputCols()方法本身就要求传入Array[String]类型的参数,你用df.columns获取的数组类型完全匹配,不存在类型错误。
你遇到的报错核心原因是动态获取的列数组和你之前静态传入的列数组内容不一致:
- 你注释的静态列数组中没有包含
total_bedrooms字段,还重复写入了population字段 - 动态获取的列数组是删除
ocean_proximity后的所有列,包含了total_bedrooms字段,而从你给出的schema可以看到该字段允许为空,VectorAssembler默认遇到输入列中的空值会直接抛出执行异常,这就是报错的根源。
解决方案
你可以根据需求选择任意一种解决方式:
- 保持和之前静态列逻辑一致,动态获取列时也排除
total_bedrooms:
val allColsExceptOceanProximity: Array[String] = dfRaw.drop("ocean_proximity", "total_bedrooms").columns
- 保留
total_bedrooms字段的前提下,提前处理空值:
// 方案A:过滤掉该字段为空的行 val dfClean = dfRaw.filter(col("total_bedrooms").isNotNull) // 方案B:用默认值填充空值,示例用0填充,也可以替换为均值、中位数等统计值 val dfClean = dfRaw.na.fill(0, Seq("total_bedrooms")) // 再从处理后的 DataFrame 中获取列 val allColsExceptOceanProximity: Array[String] = dfClean.drop("ocean_proximity").columns
- 直接配置
VectorAssembler的空值处理规则(Spark 2.2及以上版本支持):
val assembler = new VectorAssembler() .setInputCols(allColsExceptOceanProximity) .setOutputCol("features") // 可选参数:skip=跳过含空值的行 / keep=空值对应位置填0 / error=默认,遇到空值报错 .setHandleInvalid("skip")
内容的提问来源于stack exchange,提问作者joesan
相关产品推荐
相关产品推荐

