It isn’t true that RDDs are always unordered. If an RDD is the result of a sortBy operation, then it is guaranteed that it will have an order.
An RDD is not a set; it may contain duplicates.
Partitioning is not hidden from the caller, and can be controlled and queried.
Many operations do preserve both order and partitioning, such as map. That said I find it a little easy to accidentally violate the assumptions that zip depends on, since they're a little subtle, but it certainly has a purpose.
If you want to know more about Spark, then do check out this awesome video tutorial: