Spark collectAsMap获取的Map执行put操作抛出UnsupportedOperationException咨询
关于Spark collectAsMap返回Map不可修改的问题
没错,你遇到的java.lang.UnsupportedOperationException异常正好说明:通过Spark的collectAsMap()获取的Map是不可修改的。
为什么会抛出这个异常?
Spark为了保证分布式场景下的数据安全性、避免意外修改带来的问题,同时兼顾性能,collectAsMap()返回的是一个不可变的Map实现。这类不可变Map通常继承自AbstractMap,但并没有实现put()、remove()等修改类方法——当你调用这些方法时,就会触发AbstractMap中默认的抛出异常逻辑,也就是你看到的AbstractMap.put(AbstractMap.java:209)处的报错。
怎么解决修改需求?
如果需要对这个Map执行修改操作,只需要把它转换成一个可修改的Map实现(比如HashMap)即可,代码示例如下:
// 先获取不可变Map Map<K, V> immutableMap = yourRDD.collectAsMap(); // 转换成可修改的HashMap Map<K, V> mutableMap = new HashMap<>(immutableMap); // 现在可以正常执行put操作了 mutableMap.put(newKey, newValue);
额外补充
Spark的大部分集合类API返回不可变实例是一种设计习惯,这样可以避免在分布式计算中因为共享可变状态而引发的潜在问题,同时不可变集合在内存占用、并发安全上也有一定优势。
内容的提问来源于stack exchange,提问作者Sanchay
相关产品推荐
相关产品推荐

