【发布时间】:2022-12-09 16:40:10
【问题描述】:
我有一个包含以下数据的 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 |
我需要在每个 Id 的标记列中找出最大值,并从主题列中找到关联主题。
我想要的结果应该是:
| Id | Subject | Marks |
|---|---|---|
| 1 | M | 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 但得到一个错误未找到:值 array_max
df1.withColumn("MaxMarks", array_max($"Makrs")).show()
【问题讨论】:
-
看看 array_max 函数:spark.apache.org/docs/latest/api/sql/index.html#array_max
-
@EmilianoMartinez 感谢您的回复。我已经尝试了源mungingdata.com/apache-spark/arraytype-columns 中的 array_max 函数。但是得到一个错误
not found: value array_max -
您使用的是什么版本的 Spark?
-
@EmilianoMartinez 抱歉耽搁了。使用 Spark 版本 2.3.0
-
我认为数组操作从 2.4 开始可用。所以你必须使用一个UDF
标签: arrays dataframe scala apache-spark