我有以下資料幀
DF1:
---------- ---------- ---------
| Place| lat| lon|
---------- ---------- ---------
| A| X_A| Y_A|
| B| X_B| Y_B|
| C| X_C| Y_C|
---------- ---------- ---------
DF2:
---------- ---------- ---------
| City| lat| lon|
---------- ---------- ---------
| D| X_D| Y_D|
| E| X_E| Y_E|
| F| X_F| Y_F|
| G| X_G| Y_G|
| H| X_H| Y_H|
| I| X_I| Y_I|
---------- ---------- ---------
我想獲得的是從地方(從 DF1)到城市(從 DF2)的最短歐幾里德距離
所以我要做的是:首先計算A地到D城市的距離直到I,然后根據計算確定最短距離。
所以偽代碼如下所示,包含一個嵌套的 for 回圈:
for (places = ranging from A until C){
X1 = places.lat
Y1 = places.lon
for (city = ranging from D until I){
X2 = city.lat
Y2 = city.lon
list d = sqrt((X2-X1)^2 - (Y2-Y1)^2))
res[place] = min(d)}
其中res[]實際上是包含最短距離的資料框中的一列。
所以我首先想到的是CrossJoin()在兩個資料幀之間使用 a ,但是我不知道在那一步之后我應該如何繼續。
那么可以幫助任何人幫助我嗎?
uj5u.com熱心網友回復:
完成交叉連接后,您可以使用hypotfunction計算歐幾里得距離并將其存盤到distance帶有withColumndataset 方法的列中,然后通過使用聚合函式按Place列聚合distance列分組來獲得該列的最小值。min
這是完整的代碼:
import org.apache.spark.sql.functions
import org.apache.spark.sql.functions.hypot
df1.crossJoin(df2)
.withColumn("distance", hypot(df1.col("lat") - df2.col("lat"), df1.col("lon") - df2.col("lon")))
.groupBy("Place")
.agg(functions.min("distance").as("min_distance"))
您將獲得一個包含兩列的資料框,類似于以下一列:
----- -----------------
|Place|min_distance |
----- -----------------
|B |2.68700576850888 |
|C |2.545584412271571|
|A |2.82842712474619 |
----- -----------------
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/333871.html
標籤:斯卡拉 数据框 阿帕奇火花 apache-spark-sql
