scala - 在 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 |
+-------+---------+
解决方案
您可以使用该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)))
推荐阅读
- hibernate - 在 Hibernate 中调用 merge() 方法
- javascript - 如何使用查询选择器单击
- docker - 无法在 Windows 上使用 Toolbox 在代理后面运行 pull Docker Image
- angular - IONIC4 当我们从一页转到另一页并在 ios 中返回显示空白页时
- ios - 禁用特定 UIView iOS 12 的自动旋转
- html - 谷歌浏览器最新版本,73.0,网页应用溢出不再起作用
- c++ - 检查字符串单词是否包含数字且不包含数字
- javascript - 如何将两个数组JSON映射到vue中的数据
- python - 如何使用 python3 curses.window.addch 添加颜色?
- python-3.x - 如何安装filedialog包?