What do you mean by map-side join and reduce-side join in MapReduce?
The mapper performs the join
Each input data must be divided into the same number of partitions
Input to each map is in the form of a structured partition and is in sorted order
The reducer performs the join
Easier to implement than the map side join, as the sorting and shuffling phase sends the value with identical keys to the same reducer
No need to have the dataset in a structured form (or partitioned)