簡體   English   中英

查找數組列的最大值並在數據框中查找另一個數組中的關聯值

[英]Find the Max value of an Array column and find associated value in another Array with in the dataframe

我有一個包含以下數據的 csv 文件。

ID 學科 分數
1個 中、中、中 10,8,6
2個 中、中、中 5,7,9
3個 中、中、中 6,7,4

我需要在每個 Id 的標記列中找出最大值,並從主題列中找到關聯主題。

我想要的結果應該是:

ID 學科 分數
1個 10
2個 C 9
3個 P 7

我正在讀取 csv 文件並使用逗號值拆分將主題和標記作為數組列。


import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._
import org.apache.spark.sql._
import org.apache.spark.sql.types._
import org.apache.spark.sql.Column

 val spark = SparkSession.builder().getOrCreate()
    import spark.implicits._
    
    val df = spark.read.format("CSV")
                  .option("header", "true")
                  .option("delimiter", "|")
                  .option("inferSchema", "true")
                  .load("file:///p:/test/Data/test.csv")

   val df1 = df.select(col("id"),
                        split(col("subjects"),",").as("subjects"),
                        split(col("Makrs"),",").as("Makrs")
                      )

   df1.printSchema()

df1 模式是:

root
 |-- id: integer (nullable = true)
 |-- Sub: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- Mark: array (nullable = true)
 |    |-- element: string (containsNull = true)

而 df1 數據是;

+---+---------+----------+
| id| subjects|     Makrs|
+---+---------+----------+
|  1|[M, P, C]|[10, 8, 6]|
|  2|[M, P, C]| [5, 7, 9]|
|  3|[M, P, C]| [6, 7, 4]|
+---+---------+----------+

我不知道如何在數據框中的數組列中找到最大值。

我嘗試了 array_max但收到未找到的錯誤:value array_max

df1.withColumn("MaxMarks", array_max($"Makrs")).show()

如果您將 Dataframe 強類型化為您控制其類型的 Dataset,則可以非常輕松地使用map函數。 您只需要定義一個案例類 + 編碼器即可實現這一點。

我制作了一個非常簡單的 csv 文件,其中包含以下確切內容(您的數據):

Id;Subject;Marks
1;M,P,C;10,8,6
2;M,P,C;5,7,9
3;M,P,C;6,7,4

代碼看起來像這樣(大部分只是正確讀取數據):

import spark.implicits._
import org.apache.spark.sql.Encoders

case class MyClass(Id: Int, Subject: Seq[String], Marks: Seq[Int])
implicit val myEncoder = Encoders.product[MyClass]

val df = spark.read.option("header", "true").option("sep", ";").csv("csvWithArrays.csv")

val parsedDF = df
  .withColumn("Id", col("Id").cast("int"))
  .withColumn("Subject", split(col("Subject"), ","))
  .withColumn("Marks", split(col("Marks"), ",").cast("array<int>"))
  .as[MyClass]

val output = parsedDF.map{
  case MyClass(id, subject, marks) => {
    val maxMark = marks.max
    val maxSubject = subject(marks.indices.maxBy(marks))
    (id, maxSubject, maxMark) 
  }
}

output.show                                                                                                                                                                                                                                                              
+---+---+---+                                                                                                                                                                                                                                                                   
| _1| _2| _3|                                                                                                                                                                                                                                                                   
+---+---+---+                                                                                                                                                                                                                                                                   
|  1|  M| 10|                                                                                                                                                                                                                                                                   
|  2|  C|  9|                                                                                                                                                                                                                                                                   
|  3|  P|  7|                                                                                                                                                                                                                                                                   
+---+---+---+

一旦你對你的數據集進行了強類型化,你就可以輕松地使用 Scala 語言來獲得你想要的東西:)

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM