Python 2.7 通过函数传递RDD

Python 2.7 通过函数传递RDD,python-2.7,apache-spark,pyspark,Python 2.7,Apache Spark,Pyspark,基本上,我想把我加载的数据作为文本文件,在单独的行中包含GPS坐标,将它们作为参数输入到函数中,以返回某个值。我一直坚持把RDD作为论点。我理解转换和动作的概念,但我不能理解如何作为函数传递,如何将纬度和经度作为参数传递 def tester(coord): ## Normally if i was iterating for the coming line panoids = streetview.panoids(lat=coord[i][0], lon=coord[i][1]

基本上,我想把我加载的数据作为文本文件,在单独的行中包含GPS坐标,将它们作为参数输入到函数中,以返回某个值。我一直坚持把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)

它不知道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,但伪代码也应该很有用:)


说明:您不应该以迭代的方式进行,而应该是功能性的。函数将创建新的RDD,其中每个元素都是从旧RDD转换到新对象的元素。此时,您已经获得了二维数组的RDD,您必须在map()中获取三维的值并将结果附加到输入数组。

它不知道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,但伪代码也应该很有用:)


说明:您不应该以迭代的方式进行,而应该是功能性的。函数将创建新的RDD,其中每个元素都是从旧RDD转换到新对象的元素。在获取二维数组的RDD时,必须在map()中获取三维值并将结果附加到输入数组。

因此,不能修改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并将每一行映射到一个新行中,该新行的前几列相同,只是RDD中添加了一个元素(panoid)。

因此,您不能修改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并将每一行映射到一个新行中,该新行的第一列与RDD中添加的元素(panoid)相同。

代码输入:您应该使用
coord\u row
内部
tester
函数,而不是
coord
。然而,这就是我在回答中所建议的,所以我完全同意你的解决方案:)谢谢你的注意:)修复了它现在工作得很好,我不知道我不需要以某种方式指出来重复!代码输入错误:您应该使用
coord\u row
内部
tester
功能,而不是
coord
。然而,这就是我在回答中所建议的,所以我完全同意你的解决方案:)谢谢你的注意:)修复了它现在工作得很好,我不知道我不需要以某种方式指出来重复!