这是示例数据框
city, LONG, LAT
city1, 100.30, 50.11
city2, 100.20, 50.16
city3, 100.20, 51
..
我们需要计算city1
与所有城市之间以及city2
与所有城市之间的距离,并对每个城市进行迭代。函数“距离”已创建。然后,我们可以使用for循环每一行或在Python中使用数据字典。
对于数据框,如何将循环或数据字典概念应用于数据框?
例如在python中。 (不是所有的代码都显示在这里。)
citydict = dict()
citydict2=copy.deepcopy(citydict)
for city1, pciinfo1 in citydict.items():
pcicity2.pop(pci1)
for city2, cityinfo2 in citydict2.items():
s=distancecalc(cityinfo1,cityinfo2)
答案 0 :(得分:1)
crossJoin
方法可以解决问题。它返回两个数据帧的笛卡尔积。这个想法是自己跨越数据框。
import org.apache.spark.sql.functions._
df.as("thisDF")
.crossJoin(df.as("toCompareDF"))
.filter($"thisDF.city" =!= $"toCompareDF.city")
.withColumn("distance", calculateDistance($"thisDF.lon", $"thisDF.lat", $"toCompareDF.lon", $"toCompareDF.lat"))
.show
首先,我们向数据框添加一个别名,以便我们在执行连接时可以识别它。下一步是在同一Dataframe上执行crossJoin
。请注意,我们还向该新数据框添加了别名。要删除与同一城市匹配的元组,我们按城市列进行过滤。
最后,我们应用一个Spark用户定义函数,传递必要的列以计算距离。这是UDF的声明:
def calculateDistance = udf((lon1: Double, lat1: Double, lon2: Double, lat2: Double) => {
// add calculation here
})
仅此而已。希望对您有所帮助。