2016-09-06 1 views
0

Grundsätzlich möchte ich Daten, die ich geladen habe als Textdatei, die GPS-Koordinaten in separaten Zeilen enthält, um sie als Argument für eine Funktion, um einen bestimmten Wert zurückzugeben. Ich bin dabei, die RDD als Argument zu übergeben. Ich verstehe die Transformation und Aktionen Konzept, aber ich kann meinen Kopf wickeln um wie als Funktion zu übergeben und die geografische Breite und Länge passieren als Argument bekommen ..RDD über eine Funktion übergeben

def tester(coord): 
    ## Normally if i was iterating for the coming line 
    panoids = streetview.panoids(lat=coord[i][0], lon=coord[i][1]) 
    ## append the output "panoids[0]['panoid']" to the original rdd as a third element 

text_file = sc.textFile("filepath") 
split_data = text_file.map(lambda line:line.split(',')) 
print split_data.take(2) ## [[u'47.642027', u'-2.755305'], [u'47.642124', u'-2.755161']] 

output = tester(split_data) 
print output.take(2) 

Antwort

2

So können Sie eine RDD per se nicht ändern. Was Sie tun müssten, ist eine neue RDD mit den aktuellen Informationen zu erstellen, die Sie haben.

Hier ist der (ungetestet) Code, so etwas zu tun:

def tester(coord_row): 
    panoids = streetview.panoids(lat=coord_row[0], lon=coord_row[1]) 
    return [coord_row[0], coord_row[1], panoids[0]['panoid']] 

output = split_data.map(tester) 

Sie den aktuellen RDD nehmen und jede Zeile in eine neue Zeile Karte, die die ersten Spalten derselben hat, außer es ein zusätzliches Element ist (panoid) in der RDD.

+0

Typo im Code: Sie sollten 'coord_row' innerhalb' tester' Funktion verwenden, nicht 'coord'. Aber das ist, was ich in meiner Antwort vorgeschlagen habe, also stimme ich völlig mit Ihrer Lösung :) –

+0

Danke für die Aufmerksamkeit :) Es jetzt behoben – AbdealiJK

+0

arbeitete perfekt, ich wusste nicht, ich musste nicht darauf hinweisen, irgendwie zu iterieren! – MasterWizard

0

Es weiß nicht, Python, aber Code in Pseudo-Code:

def tester (coords : RDD) = { 
    coords.map (lambda c : { 
    panoids = streetview.panoids(lat=c[0], lon=c[1]) 
    result = appendToArray (c, panoids) 
    }); 
} 

AppendToArray neue Array aus 3 Elementen erstellen müssen. Ich weiß nicht, wie man mehrzeiliges Lambda in Python macht, aber Pseudocode sollte auch hilfreich sein :)

Erläuterung: Sie sollten es nicht in iterativer Weise tun, aber funktional. Die map() - Funktion erstellt eine neue RDD, in der jedes Element ein Element aus einer alten RDD ist, die in ein neues Objekt transformiert wird. Am Anfang haben Sie RDD des 2-dimensionalen Arrays, Sie müssen in map() den Wert der 3. Dimension erhalten und das Ergebnis an das Input-Array anhängen.

Verwandte Themen