【发布时间】:2015-06-26 21:15:00
【问题描述】:
我有一个 map reduce 代码,我通过某个键在每个线程中分组,然后在 reduce 部分合并结果。我目前的方法是在累加器中搜索特定的键索引,然后 mapi 仅检索该键的组合结果,其余的保持不变:
let rec groupFolder sequence acc =
match sequence with
| (by:string, what) :: rest ->
let index = acc |> Seq.tryFindIndex( fun (byInAcc, _) -> byInAcc.Equals(by) )
match index with
| Some (idx) ->
acc |> Seq.mapi( fun i (byInAcc, whatInAcc) -> if i = idx then (by, (what |> Array.append whatInAcc) ) else byInAcc, whatInAcc )
|> groupFolder rest
| None -> acc |> Seq.append( seq{ yield (by, what) } )
|> groupFolder rest
我的问题是,这是实现这一目标的更实用的方法吗?
作为这个reducer的示例输入
let GroupsCommingFromMap = [| seq { yield! [|("key1", [|1;2;3|] ); ("key2", [|1;2;3|] ); ("key3", [|1;2;3|]) |] }, seq { yield! [|("key1", [|4;5;6|] ); ("key2", [|4;5;6|] ); ("key3", [|4;5;6|]) |] } |];;
GroupsCommingFromMap |> Seq.reduce( fun acc i ->
acc |> groupFolder (i |> Seq.toList))
预期的结果应该包含所有 key1..key3 和数组 1..6
【问题讨论】:
标签: f# mapreduce functional-programming