[英]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.