我想做一些計算并將其添加到現有資料框中。我有以下函式來根據經度和緯度計算地址空間。
def getH3Address(x: Double, y: Double): String ={
h3.get.geoToH3Address(x,y)
}
我創建了一個具有以下架構的資料框:
root
|-- lat: double (nullable = true)
|-- lon: double (nullable = true)
|-- elevation: integer (nullable = true)
我想向這個名為 的資料幀添加/追加一個新列H3Address,其中地址空間是根據該行的lat和的輸入計算的lon。
這是我想要實作的資料框的一小部分:
---- ------------------ --------- ---------
| lat| lon|elevation|H3Address|
---- ------------------ --------- ---------
|51.0| 3.0| 13| a3af83|
|51.0| 3.000277777777778| 13| a3zf83|
|51.0|3.0005555555555556| 12| a1qf82|
|51.0|3.0008333333333335| 12| l3xf83|
我試過類似的東西:
df.withColumn("H3Address", geoToH3Address(df.select(df("lat")), df.select(df("lon")))
但這沒有用。
有人可以幫我嗎?
編輯:
添加@Garib的建議后,我得到以下幾行:
val getH3Address = udf(
(lat: Double, lon: Double, res: Int) => {
h3.get.geoToH3Address(lat,lon,res).toString
})
var res : Int = 10
val DF_edit = df.withColumn("H3Address",
getH3Address(col("lat"), col("lon"), 10))
這次,我收到錯誤:
[error] type mismatch;
found : Int
required: org.apache.spark.sql.Column
我該如何解決這個錯誤?嘗試了很多東西。例如通過使用lit()函式
編輯2:
使用正確的 lit() 方法后,提出的解決方案已經奏效。
解決方案:
df.withColumn("H3Address", getH3Address(col("lat"), col("lon"), lit(10)))
uj5u.com熱心網友回復:
你應該UDF從你的函式中創建一個。
用戶定義函式 (UDF) 是作用于一行的用戶可編程例程
例如:
val getH3Address = udf(
// write here the logic of your function. I used a dummy logic (x y) just for this example.
(x: Double, y: Double) => {
(x y).toString
})
val df = Seq((1, 2, "aa"), (2, 3, "bb"), (3, 4, "cc")).toDF("lat", "lon", "value")
df.withColumn("H3Address", getH3Address(col("lat"), col("lon"))).show()
您可以在此處閱讀有關 UDF 的更多資訊:https : //spark.apache.org/docs/latest/sql-ref-functions-udf-scalar.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311443.html
