如何使用Scala/spark数据框从第1行到第N行之间的一列计算值
下面是示例数据帧如何使用Scala/spark数据框从第1行到第N行之间的一列计算值,scala,apache-spark,dataframe,Scala,Apache Spark,Dataframe,下面是示例数据帧 city, LONG, LAT city1, 100.30, 50.11 city2, 100.20, 50.16 city3, 100.20, 51 .. 我们需要计算城市1和所有城市之间的距离,城市2和所有城市之间的距离,并对每个城市进行迭代。创建函数“距离”。然后我们可以使用for循环每一行,或者在Python中使用数据dict 对于dataframe,如何将循环或数据dict概念应用于dataframe 例如,在python中。不是这里显示的所有代码 cityd
city, LONG, LAT
city1, 100.30, 50.11
city2, 100.20, 50.16
city3, 100.20, 51
..
我们需要计算城市1和所有城市之间的距离,城市2和所有城市之间的距离,并对每个城市进行迭代。创建函数“距离”。然后我们可以使用for循环每一行,或者在Python中使用数据dict
对于dataframe,如何将循环或数据dict概念应用于dataframe
例如,在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)
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
首先,我们向数据帧添加一个别名,以便在执行连接时能够识别它。下一步是在同一数据帧上执行交叉连接。请注意,我们还向这个新数据帧添加了一个别名。要删除那些匹配同一城市的元组,我们按城市列进行过滤
最后,我们应用Spark用户定义函数,传递必要的列来计算距离。这是UDF的声明:
def calculateDistance = udf((lon1: Double, lat1: Double, lon2: Double, lat2: Double) => {
// add calculation here
})
就这些。希望能有所帮助。您尝试过spark/pyspark吗?是的,我的环境是scala on spark。我很早就试过pyspark,就是这样。非常感谢。我很高兴它起了作用!你能接受我的回答吗