[英]Adding the result of a function in a Dataframe column [Spark Scala]
我想做一些计算并将其添加到现有数据框中。 我有以下函数来根据经度和纬度计算地址空间。
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)))
您应该从您的函数中创建一个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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.