加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala – Spark在Dataframe中检索,具有最大值的行,列名称

发布时间:2020-12-16 10:05:58 所属栏目:安全 来源:网络整理
导读:我有一个DataFrame: name column1 column2 column3 column4first 2 1 2.1 5.4test 1.5 0.5 0.9 3.7choose 7 2.9 9.1 2.5 我想要一个带有包含列的新数据框,列名称包含行的最大值: | name | max_column ||--------|------------|| first | column4 || test |
我有一个DataFrame:

name     column1  column2  column3  column4
first    2        1        2.1      5.4
test     1.5      0.5      0.9      3.7
choose   7        2.9      9.1      2.5

我想要一个带有包含列的新数据框,列名称包含行的最大值:

| name   | max_column |
|--------|------------|
| first  | column4    |
| test   | column4    |
| choose | column3    |

非常感谢您的支持.

解决方法

可能有一些更好的编写UDF的方法.但这可能是有效的解决方案

val spark: SparkSession = SparkSession.builder.master("local").getOrCreate

//implicits for magic functions like .toDf
import spark.implicits._

import org.apache.spark.sql.functions.udf

//We have hard code number of params as UDF don't support variable number of args
val maxval = udf((c1: Double,c2: Double,c3: Double,c4: Double) =>
  if(c1 >= c2 && c1 >= c3 && c1 >= c4)
    "column1"
  else if(c2 >= c1 && c2 >= c3 && c2 >= c4)
    "column2"
  else if(c3 >= c1 && c3 >= c2 && c3 >= c4)
    "column3"
  else
    "column4"
)

//create schema class
case class Record(name: String,column1: Double,column2: Double,column3: Double,column4: Double)

val df = Seq(
  Record("first",2.0,1,2.1,5.4),Record("test",1.5,0.5,0.9,3.7),Record("choose",7,2.9,9.1,2.5)
).toDF();

df.withColumn("max_column",maxval($"column1",$"column2",$"column3",$"column4"))
  .select("name","max_column").show

产量

+------+----------+
|  name|max_column|
+------+----------+
| first|   column4|
|  test|   column4|
|choose|   column3|
+------+----------+

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读