We need subclass `Partitioner` and implement `equals`. This is important for `groupBy` and `join`, because Spark compares the partitioner to determine the shuffle dependency.