Есть ли объяснение RDD в искры

В частности, если я скажу

rdd3 = rdd1.join(rdd2)

тогда, когда я вызываю rdd3.collect, в зависимости от используемого Partitioner, либо данные перемещаются между разделами узлов, либо соединение выполняется локально на каждом разделе (или, насколько мне известно, что-то еще полностью). Это зависит от того, что бумага RDD называет "узкими" и "широкими" зависимостями, но кто знает, насколько хорош оптимизатор на практике.

В любом случае, я могу подобрать из вывода трассировки, что на самом деле произошло, но было бы неплохо позвонить rdd3.explain.

Существует ли такая вещь?

Ответ 1

Я думаю, что toDebugString успокоит ваше любопытство.

scala> val data = sc.parallelize(List((1,2)))
data: org.apache.spark.rdd.RDD[(Int, Int)] = ParallelCollectionRDD[8] at parallelize at <console>:21

scala> val joinedData = data join data
joinedData: org.apache.spark.rdd.RDD[(Int, (Int, Int))] = MapPartitionsRDD[11] at join at <console>:23

scala> joinedData.toDebugString
res4: String =
(8) MapPartitionsRDD[11] at join at <console>:23 []
 |  MapPartitionsRDD[10] at join at <console>:23 []
 |  CoGroupedRDD[9] at join at <console>:23 []
 +-(8) ParallelCollectionRDD[8] at parallelize at <console>:21 []
 +-(8) ParallelCollectionRDD[8] at parallelize at <console>:21 []

Каждое углубление является этапом, поэтому это должно выполняться как два этапа.

Кроме того, оптимизатор довольно приличный, однако я бы предложил использовать DataFrames, если вы используете 1.3+, поскольку во многих случаях оптимизатор EVEN лучше:)