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

I am a little concerned about the addition of an extra tuple object allocation here.  This may not be a problem, but we'll want to run some benchmarks and make sure that we are not slowing down the on-heap version here.