2016-09-06 21 views
0

Gibt es eine effiziente Möglichkeit, die ersten 1000 Elemente von einer RDD zu nehmen und sie von der RDD zu entfernen?Spark - Take and Subtract

Zeit, was ich tue, ist:

small_array = big_sorted_rdd.take(1000) 
big_sorted_rdd_without_small_array = big_sorted_rdd.subtract(
    sc.parallize(small_array)) 

Antwort

0

Dies ist kein gerade nach vorne, was seit der RDD zu tun ist, verteilt (wie der Name schon sagt) so definiert, den 1000 ersten Artikel ist nicht einfach.

Es gibt jedoch Möglichkeiten, zu erreichen, was Sie tun, außer was Sie vorgeschlagen haben.

Zuerst können Sie die Reihenfolge für das Element definieren, z. B. jedes Element in ein Tupel umwandeln: (Zahl, Element), wobei Zahl von 1 bis # von Elementen geht. Dann nutzen Sie Filter auf dem RDD die ersten X Artikel zu schneiden:

big_rdd.filter(_._1 > 1000) 

zweite Idee, die Zeiten, die ich von X ersten Elementen erhalten benötigt, um loszuwerden waren eine iterative Berechnung über die Elemente auszuführen (Ich erinnere mich, einmal habe ich versucht, verringern Sie die Belastung des Systems). Also, was Sie tun können, ist Ihre Daten in Teile von 1000 Elementen in jeder Chunk partitionieren, dann nehmen Sie ein Stück zu einer Zeit, und führen Sie Ihre Berechnungen auf sie, machen die RDD wie folgt aussehen:

RDD[(chunkNumber, List[elements])] 

dann werden Sie arbeiten auf 1000 Elemente jedes Mal, diese Idee nehmen weiter können Sie Ihren Datenbestand wie folgt aussehen:

Array[RDD[elements]] 

Dann wird jedes Mal auf RDD von 1000 Elementen arbeiten (iterieren Array)

0

val zippedRDD = rdd. zipWithIndex()

val neededRDD = rdd.filter (t => t._2 < 1000)

val unNeededRDD = rdd.filter (t => t._2> = 1000)