[SPARK-2873] [SQL] using ExternalAppendOnlyMap to resolve OOM when aggregating

Using ExternalAppendOnlyMap to resolve OOM when aggregating.
Using "spark.shuffle.spill" to open it or not 
Hive udaf does not support yet for udaf need Serializable

Join has  the same problem. but using ExternalAppendOnlyMap as CoGroupedRDD  seems to reduce performance. i try another way by using ExternalAppendOnlyMap. but it needs testing .i will commit it in another batch.

`protected` instead of making this public.