Arbeiten mit Pair RDDs in PySpark

Grundlagen von Big Data mit PySpark

Upendra Devisetty

Science Analyst, CyVerse

Einführung in Pair RDDs in PySpark

  • Reale Datensätze sind meist Schlüssel/Wert-Paare

  • Jede Zeile ist ein Schlüssel und verweist auf einen oder mehrere Werte

  • Pair RDD ist eine spezielle Struktur für solche Datensätze

  • Pair RDD: Schlüssel = Kennung, Wert = Daten

Grundlagen von Big Data mit PySpark

Pair RDDs erstellen

  • Zwei gängige Wege, Pair RDDs zu erstellen

    • Aus einer Liste von Schlüssel-Wert-Tupeln
    • Aus einem normalen RDD
  • Daten in Schlüssel/Wert-Form für Pair RDD bringen

my_tuple = [('Sam', 23), ('Mary', 34), ('Peter', 25)]
pairRDD_tuple = sc.parallelize(my_tuple)
my_list = ['Sam 23', 'Mary 34', 'Peter 25']
regularRDD = sc.parallelize(my_list)
pairRDD_RDD = regularRDD.map(lambda s: (s.split(' ')[0], s.split(' ')[1]))
Grundlagen von Big Data mit PySpark

Transformationen auf Pair RDDs

  • Alle normalen Transformationen funktionieren auf Pair RDDs

  • Übergib Funktionen, die auf Schlüssel-Wert-Paaren statt Einzelelementen arbeiten

  • Beispiele für Pair RDD-Transformationen

    • reduceByKey(func): Werte mit gleichem Schlüssel zusammenführen

    • groupByKey(): Werte mit gleichem Schlüssel gruppieren

    • sortByKey(): RDD nach Schlüssel sortiert zurückgeben

    • join(): Zwei Pair RDDs anhand ihres Schlüssels verbinden

Grundlagen von Big Data mit PySpark

reduceByKey()-Transformation

  • reduceByKey() fasst Werte mit gleichem Schlüssel zusammen

  • Führt parallele Operationen pro Schlüssel im Datensatz aus

  • Ist eine Transformation, keine Action

regularRDD = sc.parallelize([("Messi", 23), ("Ronaldo", 34), 
                             ("Neymar", 22), ("Messi", 24)])
pairRDD_reducebykey = regularRDD.reduceByKey(lambda x,y : x + y)
pairRDD_reducebykey.collect()

[('Neymar', 22), ('Ronaldo', 34), ('Messi', 47)]
Grundlagen von Big Data mit PySpark

sortByKey()-Transformation

  • sortByKey() sortiert Pair RDDs nach Schlüssel

  • Gibt ein nach Schlüssel auf-/absteigend sortiertes RDD zurück

pairRDD_reducebykey_rev = pairRDD_reducebykey.map(lambda x: (x[1], x[0]))
pairRDD_reducebykey_rev.sortByKey(ascending=False).collect()

[(47, 'Messi'), (34, 'Ronaldo'), (22, 'Neymar')]
Grundlagen von Big Data mit PySpark

groupByKey()-Transformation

  • groupByKey() gruppiert alle Werte mit demselben Schlüssel im Pair RDD
airports = [("US", "JFK"),("UK", "LHR"),("FR", "CDG"),("US", "SFO")]
regularRDD = sc.parallelize(airports)
pairRDD_group = regularRDD.groupByKey().collect()
for cont, air in pairRDD_group:
  print(cont, list(air))

FR ['CDG'] US ['JFK', 'SFO'] UK ['LHR']
Grundlagen von Big Data mit PySpark

join()-Transformation

  • Die join()-Transformation verknüpft zwei Pair RDDs anhand ihres Schlüssels
RDD1 = sc.parallelize([("Messi", 34),("Ronaldo", 32),("Neymar", 24)])
RDD2 = sc.parallelize([("Ronaldo", 80),("Neymar", 120),("Messi", 100)])
RDD1.join(RDD2).collect()

[('Neymar', (24, 120)), ('Ronaldo', (32, 80)), ('Messi', (34, 100))]
Grundlagen von Big Data mit PySpark

Lass uns üben!

Grundlagen von Big Data mit PySpark

Preparing Video For Download...