Это можно сделать с помощью оконных функций, чтобы назначить каждой строке случайный индекс, повторив это в отдельном DF, а затем присоединившись к индексу:
>>> from pyspark.sql.window import Window
>>> import pyspark.sql.functions as F
>>> df = spark.range(5).toDF("x")
>>> left = df.withColumn("rnd", F.row_number().over(Window.orderBy(F.rand())))
>>> right = df.withColumnRenamed("x", "y").withColumn("rnd", F.row_number().over(Window.orderBy(F.rand())))
>>> dff = left.join(right, left.rnd == right.rnd).drop("rnd")
>>> dff.show()
19/06/29 13:17:04 WARN WindowExec: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.
19/06/29 13:17:04 WARN WindowExec: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.
+---+---+
| x| y|
+---+---+
| 3| 3|
| 2| 0|
| 0| 2|
| 1| 1|
| 4| 4|
+---+---+
Как следует из предупреждения, на практике это может быть не очень хорошей идеей.