Optimisations on spark jobs
More information about the job would help:
Some of the generic suggestions:

Arrangement operators is very important. Not all arrangements will result in the same performance. Arrangement of operators should be such to reduce the number of shuffles and the amount of data shuffled. Shuffles are fairly expensive operations; all shuffle data must be written to disk and then transferred over the network.


repartition , join, cogroup, and any of the *By or *ByKey transformations can result in shuffles. 


rdd.groupByKey().mapValues(_.sum) will produce the same results as rdd.reduceByKey(_ + _). However, the former will transfer the entire dataset across the network, while the latter will compute local sums for each key in each partition and combine those local sums into larger sums after shuffling.


You can avoid shuffles when joining two datasets by taking advantage
  of broadcast variables.


Avoid the flatMap-join-groupBy pattern.
Avoid reduceByKey When the input and output value types are different.

This is not exhaustive. And you should also consider tuning your configuration of Spark.
I hope it helps.
I am new to spark and want to know about optimisations on spark jobs.
My job is a simple transformation type job merging 2 rows based on a condition. What are the various types of optimisations one can perform over such jobs?