2017-10-28 2 views
-1

Angenommen, ich versuche, diesen regulären Ausdruck "RT \ s * @ USER \ w \ w {8}: \ s *" zu entfernen, und ich möchte diese Form des regulären Ausdrucks in meiner RDD entfernen.Wie entfernt man bestimmte reguläre Ausdrücke in PySpark mit RDD?

Mein aktueller RDD ist:

text = sc.textFile(...) 
delimited = text.map(lambda x: x.split("\t")) 

und hier ist der Teil, wo ich regulären Ausdruck zu entfernen bin versucht. Ich versuchte RDD-Transformation zu tun, um alle Strings loszuwerden, die mit diesem regulären Ausdruck übereinstimmen, aber es gab mir einen Fehler.

abc = delimited.map(lambda x: re.sub(r"RT\s*@USER\w\w{8}:\s*", " ", x)) 
TypeError: expected string or buffer 

und

abc = re.sub(r"RT\s*@USER\w\w{8}:\s*", " ", delimited) 
TypeError: expected string or buffer 

und

abc = delimited.map(lambda x: re.sub(r"RT\s*@USER\w\w{8}:\s*", " ", text)) 
Exception: It appears that you are attempting to broadcast an RDD or reference an RDD from an action or transformation. RDD transformations and actions can only be invoked by the driver, not inside of other transformations; for example, rdd1.map(lambda x: rdd2.values.count() * x) is invalid because the values transformation and count action cannot be performed inside of the rdd1.map transformation. For more information, see SPARK-5063. 

Ich möchte diesen regulären Ausdruck entfernen, so dass ich auf die nächsten RDD Transformationen fortgesetzt werden kann. Wie mache ich diesen Code in PySpark?

Antwort

0

re.sub erwartet einen String.

  • in der ersten anonymen Funktion:

    lambda x: re.sub(r"RT\s*@USER\w\w{8}:\s*", " ", x) 
    

    x ist eine Liste, da Sie die Zeile in der vorherige Transformation geteilt.

  • Im zweiten Versuch übergeben Sie ein RDD: delimeted

  • Im dritten Code-Snippet Sie einen anderen RDD passieren: text.

Wenn Sie für jedes Element der Liste diesem regulären Ausdruck entfernen möchten, versuchen Sie dies:

abc = delimited.map(lambda l: [re.sub(r"RT\s*@USER\w\w{8}:\s*", " ", x) for x in l]) 
+0

vielen Dank ... – kys92