Spark Scala如何将WrappedArray转List?解决DataFrame取数报错
报错本质
Spark 将数组类型列从 Executor 拉取到 Driver 端后,底层的实际存储实现是 scala.collection.mutable.WrappedArray,并非代码中强转的 scala.collection.immutable.List,因此触发类型转换异常。
可行解决思路
- 最小改动方案:直接调整取数时的强转泛型,匹配 Spark 返回的实际数组实现。将取数代码修改为:
val rawArr = words(0).getAs[mutable.WrappedArray[String]](0) // 后续需要不可变List时,直接调用内置转换方法即可 val test1 = rawArr.toList - 高兼容方案:不绑定具体集合实现类做强转,用上层公共接口类型承接返回值,不受 Spark 版本、序列化逻辑变动的影响。因为
WrappedArray本身继承自Seq/Iterable接口,直接用上层接口取数后再转成目标 List 即可:val rawArr = words(0).getAs[Seq[String]](0) val test1 = rawArr.toList - 零适配方案:如果完全不确定当前 Spark 版本返回的数组具体实现,可以用最高层级的迭代器接口承接值,彻底避免类型错配:
val test1 = words(0).getAs[Iterable[String]](0).toList
实践提醒:取 Spark 拉取的集合类值时,尽量不要直接强转具体的集合实现类(比如不可变 List),优先用上层公共接口承接值,能从根源上避免类型转换类的报错。
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

