我有一个csv文件与以下数据。
<表类>
Id
主题
是
tbody><<tr>1 M P C 10、8、6 2M P C 5、7、9 3 M P C 6, 7 4 表类>
如果你将你的Dataframe强类型化为你控制的数据集,你可以很容易地使用map
函数。你只需要定义一个case类+编码器就可以了。
我制作了一个非常简单的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语言来得到你想要的:)
希望这对你有帮助!