Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Scala/spark数据框从第1行到第N行之间的一列计算值_Scala_Apache Spark_Dataframe - Fatal编程技术网

如何使用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,就是这样。非常感谢。我很高兴它起了作用!你能接受我的回答吗