2016-10-31 3 views
0

Wie in der Frage angegeben, versuche ich einen Hash für jede Zeile von RDD zu generieren. Für meinen Zweck kann ich zipWithUniqueId() Methode nicht verwenden, brauche ich einen Hash aller Spalten für jede Zeile der RDD.Wie generiert man einen Hash für jede Zeile von RDD? (PYSPARK)

for row in DataFrame.collect(): 
    return hashlib.sha1(str(row)) 

Ich weiß, dass ist der schlechteste Weg, Iterating in RDD, aber ich bin Anfänger mit Pyspark. Die Probleme sind jedoch: Ich bekomme für jede Zeile den gleichen Hash. Ich habe versucht, starke kollisionsresistente Hash-Funktion zu verwenden, aber es ist zu langsam. Gibt es einen Weg, das Problem zu lösen? Vielen Dank im Voraus :)

Antwort

1

Ihre Hashing-Methode scheint in Ordnung zu sein. Bist du sicher, dass du Python richtig verwendest? Wenn Sie bereitgestellten Code in eine Funktion eingeben, wird immer der Hash der ersten Zeile im Datenframe zurückgegeben, da es sich um eine Rückgabe innerhalb der Schleife handelt.

Sie können Hashes in verteilten Art und Weise berechnen, indem von Datenrahmen zu RDD gehen und Mapping durchführen, zum Beispiel:

>>> import hashlib 
>>> numbers = spark.range(10) 
>>> numbers.show() 
+---+ 
| id| 
+---+ 
| 0| 
| 1| 
| 2| 
| 3| 
| 4| 
| 5| 
| 6| 
| 7| 
| 8| 
| 9| 
+---+ 

>>> numbers.rdd.map(lambda row: hashlib.sha1(str(row)).hexdigest()).collect() 
['ec0dbe879dee5ca3b0d5f80687993273213611c9', 
'd19469cfdac63a279b2068a989bebb8918af721a', 
'c5051bbf3ac45c49e29041b9bd840badd484fd94', 
'7916b1b00f01e1676a3ed7ff80e9614430c74e4d', 
'3ef92cd5a3abdbf996694ba08685676b26478121', 
'6e0820c8a947c2d0f53c2d2957e4d256f6e75f25', 
'2297e8b06e13cc79861aed7c919b5333dfe39049', 
'1b64fd47d48f2fc7d7d45a4c6e9b1958e973ab8c', 
'6e53b27c52c20e2fb2ffa5b3a1013c13fad21db7', 
'02d08951fde664abbbec94b37ab322e751c40e33'] 
+0

Vielen Dank, schließlich funktioniert es in einer pyspark Art und Weise. –

Verwandte Themen