【发布时间】:2021-11-28 09:53:22
【问题描述】:
我想做一些计算并将其添加到现有数据框中。 我有以下函数可以根据经度和纬度计算地址空间。
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)
我想在此 Dataframe 中添加/追加一个名为 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)))
【问题讨论】:
标签: scala dataframe apache-spark user-defined-functions calculation