我正在尝试将地图列表(Seq [Map [String,Map [String,String]]]转换为RDD表/元组,其中地图中的每个键->值对都平面映射到元组中与外部地图的键。例如
Map(
1 -> Map('k' -> 'v', 'k1' -> 'v1')
)
成为
(1, 'k', 'v')
(1, 'k1', 'v1')
我尝试了以下方法,但是在并发问题上似乎失败了。我有两个工作程序节点,它两次重复键->值(我认为这是因为我做错了此事)
假设我将地图类型保存在案例类“记录”中
val rdd = sc.parallelize(1 to records.length)
val recordsIt = records.iterator
val res: RDD[(String, String, String)] = rdd.flatMap(f => {
val currItem = recordsIt.next()
val x: immutable.Iterable[(String, String, String)] = currItem.mapData.map(v => {
(currItem.identifier, v._1, v._2)
})
x
}).sortBy(r => r)
是否有一种方法可以并行化这项工作而不会遇到严重的并发问题(我怀疑这是正在发生的事情?
示例重复输出
(201905_001ac172c2751c1d4f4b4cb0affb42ef_gFF0dSg4iw,CID,B13131608623827542)
(201905_001ac172c2751c1d4f4b4cb0affb42ef_gFF0dSg4iw,CID,B13131608623827542)
(201905_001ac172c2751c1d4f4b4cb0affb42ef_gFF0dSg4iw,ROD,19190321)
(201905_001ac172c2751c1d4f4b4cb0affb42ef_gFF0dSg4iw,ROD,19190321)
(201905_001b3ba44f6d1f7505a99e2288108418_mSfAfo31f8,CID,339B4C3C03DDF96AAD)
(201905_001b3ba44f6d1f7505a99e2288108418_mSfAfo31f8,CID,339B4C3C03DDF96AAD)
(201905_001b3ba44f6d1f7505a99e2288108418_mSfAfo31f8,ROD,19860115)
(201905_001b3ba44f6d1f7505a99e2288108418_mSfAfo31f8,ROD,19860115)
答案 0 :(得分:2)
Spark parallelize
从一开始就非常有效(因为您已经开始将数据存储在内存中,因此只需在本地进行迭代就便宜得多),不过,更惯用的方法是简单的{{1} }:
flatMap