With Spark DataFrames, we shard by which of the following

A. Random partitioning
B. Row-based partitioning
C. Column-based partitioning
D. Shuffling-based partitioning