如何使用Scala / Spark数据帧从第1行到第N行之间的一列计算值

时间:2018-07-31 07:48:31

标签: scala apache-spark dataframe

这是示例数据框

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)

1 个答案:

答案 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
})

仅此而已。希望对您有所帮助。