[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.

How about we add something like `Concrete subclasses of this trait must implement the following abstract members:`  and then use [wiki syntax](https://wiki.scala-lang.org/display/SW/Syntax) to make the items into a list.