2016-09-06 109 views
0

基本上,我想将包含GPS坐标的textFile作为textFile载入的数据输入到函数的参数中以返回特定值。我被困在通过RDD作为参数。我理解的转变和行动的概念,但我不能换我周围的头如何传递的功能,并获得纬度和经度,以作为参数传递..通过函数传递RDD

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) 

回答

2

因此,您无法修改RDD本身。你需要做的是使用你现有的信息创建一个新的RDD。

这里的(未经测试)的代码做这样的事情:

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) 

你把当前RDD和每一行映射到一个新行具有第一列一样,除了有一个额外的元素( panoid)在RDD中。

+0

代码错字:您应该在'tester'函数内使用'coord_row',而不是'coord'。然而,这是我在我的答案建议,所以我完全同意你的解决方案:) –

+0

感谢您注意:)现在修复它 – AbdealiJK

+0

完美工作,我不知道我没有指出,以某种方式迭代! – MasterWizard

0

它不知道Python,但代码伪代码:

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

AppendToArray必须创建3种元素的新的数组。我不知道如何在Python中使用多线lambda,但伪代码也应该有所帮助:)

说明:您不应该以迭代的方式来实现,而应该使用它。 map()函数将创建新的RDD,其中每个元素都是从旧RDD转换为新对象的元素。在开始你有RDD的二维数组,你必须在map()中获得第三维的值并将结果附加到输入数组。