【问题标题】:Adding the result of a function in a Dataframe column [Spark Scala]在 Dataframe 列中添加函数的结果 [Spark Scala]
【发布时间】: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 的新列,其中地址空间是根据该行的 latlon 的输入计算得出的。

这是我想要实现的数据框的一小部分:

+----+------------------+---------+---------+
| 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


    【解决方案1】:

    你应该在你的函数之外创建一个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

    【讨论】:

    • 我已经在正文中说明了我想要使用的功能。我必须将该 def getH3Address 转换为 UDF 吗?
    • 是的,你应该这样做。从我对你的实现的回答中替换 udf 的定义。
    • 现在,我收到类型不匹配错误。见我上面的编辑
    • df.withColumn("H3Address", getH3Address(col("lat"), col("lon"), lit(10))) 应该在这里工作。你在使用lit时遇到了什么错误?
    • 别忘了先导入lit
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2021-06-11
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多