package
0.0.0-20240828052546-079cc6e6950d
Repository: https://github.com/kokoiruby/go_learning.git
Documentation: pkg.go.dev

# README

MapReduce

MapReduce 是一种编程模型和处理大规模数据集的计算框架/控制逻辑。

MapReduce 由 Google 提出,用于并行化和分布式处理大规模数据集,以便能够高效地在大量计算机集群上运行。

img

流程:

  1. Map
    • 输入数据集被划分成若干个小的子集,每个子集称为一个 K/V。
    • 并行执行,每个输入 K/V 经过 Map 函数处理后,生成若干个中间 K/V。
  2. Shuffle/Filter
    • 过渡阶段,中间 K/V 会被重新分区和排序,以便将相同 K 的数据传递给同一个 Reduce。
  3. Reduce
    • 接收中间 K/V,并对具有相同 K 的 V 进行归并操作。

UC:

  • 大数据处理领域被广泛应用,例如数据分析、日志处理、搜索引擎索引构建

  • Hadoop 是一个基于 MapReduce 的开源框架,提供了对大规模数据的存储和处理能力。

Example:

USER_ID MOVIE_ID SCORE TIMESTAMP
196     242      3     881250949
186     302      3     891717742
196     377      1     878887116
244     51       2     880606923
166     346      1     886397596
186     474      4     884182806
186     265      2     881171488
  1. Map:
// k → v
196:242
186:302
196:377
244:51
166:346
186:27
186:265
  1. Shuffule/Filter:
// merget
166:346
186:302,274,265
196:242,377
244:51  
  1. Reduce:
// count
166:1
186:3
196:2
244:1 

Map

// MapStrToInt iter a string arr & call fn then append to a new int arr
func MapStrToInt(arr []string, fn func(s string) int) []int {
	var newArray []int
	for _, it := range arr {
		newArray = append(newArray, fn(it))
	}
	return newArray
}

list = []string{"1", "2", "3"}
y := MapStrToInt(list, func(s string) int {
	i, _ := strconv.Atoi(s)
	return i
})
fmt.Printf("%v\n", y) //[1, 2, 3]

Shuffle/Filter

// Filter iter int arr & call fn to filter then append to a new int arr
// fn returns bool as cond
func Filter(arr []int, fn func(n int) bool) []int {
	var newArray []int
	for _, it := range arr {
		if fn(it) {
			newArray = append(newArray, it)
		}
	}
	return newArray
}

var s = []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
out := Filter(s, func(n int) bool {
	return n%2 == 1
})
fmt.Printf("%v\n", out) // [1 3 5 7 9]

Reduce

// Reduce iter string arr & call fn to then sum
func Reduce(arr []string, fn func(s string) int) int {
	sum := 0
	for _, it := range arr {
		sum += fn(it)
	}
	return sum
}

var list = []string{"a", "bb", "ccc"}
x := Reduce(list, func(s string) int {
	return len(s)
})
fmt.Printf("%v\n", x) // 6

Essense

Map/Reduce/Filter只是一种控制逻辑真正的业务逻辑是在传给他们的数据和那个函数来定义的,经典的**“业务逻辑”和“控制逻辑”分离解耦**的编程模式。