首页 > 解决方案 > 在 DataFrame 中选择 Array 的最后一个元素

问题描述

我正在做一个项目,我正在处理一些具有复杂模式/数据结构的嵌套 JSON 日期。基本上我想要做的是过滤掉数据框中的一列,以便我选择数组中的最后一个元素。我完全坚持如何做到这一点。我希望这是有道理的。

下面是我想要完成的一个例子:

val singersDF = Seq(
  ("beatles", "help,hey,jude"),
  ("romeo", "eres,mia"),
  ("elvis", "this,is,an,example")
).toDF("name", "hit_songs")

val actualDF = singersDF.withColumn(
  "hit_songs",
  split(col("hit_songs"), "\\,")
)

actualDF.show(false)
actualDF.printSchema() 

+-------+-----------------------+
|name   |hit_songs              |
+-------+-----------------------+
|beatles|[help, hey, jude]      |
|romeo  |[eres, mia]            |
|elvis  |[this, is, an, example]|
+-------+-----------------------+
root
 |-- name: string (nullable = true)
 |-- hit_songs: array (nullable = true)
 |    |-- element: string (containsNull = true)

输出的最终目标如下,选择 hit_songs 数组中的最后一个“字符串”。

我不担心架构之后会是什么样子。

+-------+---------+
|name   |hit_songs|
+-------+---------+
|beatles|jude     |
|romeo  |mia      |
|elvis  |example  |
+-------+---------+

标签: scalaapache-sparkapache-spark-sql

解决方案


您可以使用该size函数计算数组中所需项的索引,然后将其作为Column.apply(显式或隐式)的参数传递:

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

actualDF.withColumn("hit_songs", $"hit_songs".apply(size($"hit_songs").minus(1)))

或者:

actualDF.withColumn("hit_songs", $"hit_songs"(size($"hit_songs").minus(1)))

推荐阅读