2016-04-06 9 views
0

Ich habe ein aktuelles RDD Daten wie diesepyspark aufgeteilt Text mit id

DataRDD = [(0,u'A chunk of text'),(1,u'Test sentence check')] 

mein Ziel ist so braucht diesen Text in Worte zu spalten, während id jenes Satzes hält

mein Ergebnis wie

sein würde
[(0,u'A'),(0,u'chunk'),... ,(1,u'check')] 

jetzt bin ich versuche zur Zeit mit Split()

result = DataRDD.flatmap(lambda (id,text):(id,text.split())) 
zu verwenden flatmap

aber der Code funktioniert nicht, sollte ich Funktion geschrieben, um diesen Text anstelle von split() direkt zu teilen?

Antwort

1

Ein Problem ist nicht sehr präzise Beschreibung so ist hier eine Liste von Fragen:

  • DataRDD ist kein RDD. Ich nehme an, es ist nur eine Abkürzung, aber eine MCVE ist immer willkommen. Diese Taste dient auch folgen PEP 8, wenn es um Namenskonvention kommt:

    data_rdd = sc.parallelize([(0,u'A chunk of text'),(1,u'Test sentence check')]) 
    
  • es keine solche Verfahren wie RDD.flatmap ist. Die richtige Methode ist RDD.flatMap:

    data_rdd.flatMap(...) 
    
  • Tupel Parameter auspacken hat 3. Siehe in Python entfernt PEP 3113 so folgende Syntax

    lambda (id,text): ... 
    

    auf Ihrer Plattform nicht gültig sein kann. Wenn Sie es tragbar machen will, sollte es so etwas wie dieses:

    lambda kv: (kv[0], kv[1].split()) 
    
  • flatMap erwartet eine iterable Struktur. Wenn Sie eine Funktion wie oben verwenden, wird sie einfach eine tuple glätten.

    data_rdd.flatMap(lambda kv: (kv[0], kv[1].split())).collect() 
    ## [0, ['A', 'chunk', 'of', 'text'], 1, ['Test', 'sentence', 'check']] 
    

    Um es Ihnen arbeiten eine iterable wie diese bauen sollen:

    lambda kv: ((kv[0], v) for v in kv[1].split()) 
    
  • schließlich Aufgaben wie diese sind so verbreitet, dass es eine spezielle flatMapValues Methode ist:

    data_rdd.flatMapValues(str.split)