title: Partition data for efficient joining for Spark dataframe/dataset
body: <p>I need to <code>join</code> many DataFrames together based on some shared key columns. For a key-value RDD, one can specify a partitioner so that data points with same key are shuffled to same executor so joining is more efficient (if one has shuffle related operations before the <code>join</code>). Can the same thing can be done on Spark DataFrames or DataSets?</p>