Ich lese Daten aus CSV und konvertiert diese Daten in ein Python-Objekt. Aber wenn ich versuche, dass mit benutzerdefinierten Objekte Klasse RDD iterieren, erhalte ich Fehler wie,Iterieren benutzerdefinierte Klassenobjekte in einem RD RD RD
_pickle.PicklingError: Can't pickle <class '__main__.User'>: attribute lookup User on __main__ failed
ich hier einen Teil des Codes hinzufügen,
class User:
def __init__(self, line):
self.user_id = line[0]
self.location = line[1]
self.age = line[2]
def create_user(line):
user = User(line)
return user
def print_user(line):
user = line
print(user.user_id)
conf = (SparkConf().setMaster("local").setAppName("exercise_set_2").set("spark.executor.memory", "1g"))
sc = SparkContext(conf = conf)
users = sc.textFile("BX-Users.csv").map(lambda line: line.split(";"))
users_objs = users.map(lambda entry: create_user(entry))
users_objs.map(lambda entry: print_user(entry))
Für den obigen Code , erhalte ich Ergebnisse wie,
PythonRDD[93] at RDD at PythonRDD.scala:43
CSV-Datenquelle URL (eine Zip-Extraktion benötigt): HERE
UPDATE: Wenn ich den Code ändere, um Collect einzufügen, wird es wieder zu einem Fehler kommen. Ich muss es trotzdem mit Pickle versuchen. Ich habe das vorher noch nie ausprobiert. Wenn jemand eine Probe hat, kann ich es leicht machen.
users_objs = users.map(lambda entry: create_user(entry)).collect()
Das funktioniert möglicherweise mit einer lokalen Konfiguration, aber es funktioniert nicht im Cluster/Client, es sei denn, Ihre Knoten teilen sich einen NFS-Mount. – mwm314
Dies ist eine schnelle Lösung, aber ich werde meine Antwort aktualisieren, wenn ich die Klassen Pickbar ändern. – Mitty