【发布时间】:2021-01-08 13:10:30
【问题描述】:
输入:
val df = Seq((10, (35, 25))).toDF("id", "scorePair")
df.show
+---+---------+
| id|scorePair|
+---+---------+
| 10| [35, 25]|
+---+---------+
预期输出:
+---+-----------+
| id|totalScore |
+---+-----------+
| 10| 60|
+---+-----------+
想做这样的事情,但是不接受Row类型:
// error
val add = udf((row: Row) => {row match {case (a: Int, b: Int) => a + b}})
df.withColumn("totalScore", add(col("scorePair")))
为什么Row类型是不正确的思考
"Dataframe 是 Dataset[Row] 的别名"
?
我应该使用什么类型?我怎样才能实现它?
- 我强调 Row 类型,因为至少我设法通过以下方式使用 Row(将列的每个单元格视为 Row ) 来实现:
val add = udf((rows: Seq[Row]) => {rows.map {case Row(a: Int, b: Int) => a + b}})
df.groupBy("id").agg(collect_list("scorePair") as "pairSeq").withColumn("totalScore1", add(col("pairSeq"))).select(col("id"), explode(col("totalScore1")) as "totalScore").show
+---+----------+
| id|totalScore|
+---+----------+
| 10| 60|
+---+----------+
但这真的不干净!
【问题讨论】:
-
我在尝试的尝试中实际上犯了一个错误!如果我从
val add = udf((row: Row) => {row match {case (a: Int, b: Int) => a + b}})更改为val add = udf((row: Row) => {row match {case Row(a: Int, b: Int) => a + b}}),它应该是正确的。这也回答了关于 Row 类型的问题,所以是的,它是 Row 类型,一切都是一致的。所以我正在考虑结束这个问题。
标签: scala apache-spark apache-spark-sql user-defined-functions