首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >选择DataFrame中数组的最后一个元素

选择DataFrame中数组的最后一个元素
EN

Stack Overflow用户
提问于 2018-05-30 05:09:34
回答 3查看 8.4K关注 0票数 4

我正在做一个项目,我正在处理一些具有复杂模式/数据结构的嵌套JSON日期。基本上,我想要做的是过滤掉数据帧中的一列,这样我就可以选择数组中的最后一个元素。我完全不知道该怎么做。我希望这是有意义的。

下面是我试图实现的一个示例:

代码语言:javascript
运行
复制
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数组中的最后一个“字符串”。

我并不担心模式之后会是什么样子。

代码语言:javascript
运行
复制
+-------+---------+
|name   |hit_songs|
+-------+---------+
|beatles|jude     |
|romeo  |mia      |
|elvis  |example  |
+-------+---------+
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-30 05:23:26

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

代码语言:javascript
运行
复制
import org.apache.spark.sql.functions._
import spark.implicits._

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

或者:

代码语言:javascript
运行
复制
actualDF.withColumn("hit_songs", $"hit_songs"(size($"hit_songs").minus(1)))
票数 9
EN

Stack Overflow用户

发布于 2018-05-30 05:26:27

这里有一种方法:

代码语言:javascript
运行
复制
val actualDF = Seq(
  ("beatles", Seq("help", "hey", "jude")),
  ("romeo", Seq("eres", "mia")),
  ("elvis", Seq("this", "is", "an", "example"))
).toDF("name", "hit_songs")

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

actualDF.withColumn("total_songs", size($"hit_songs")).
  select($"name", $"hit_songs"($"total_songs" - 1).as("last_song"))
// +-------+---------+
// |   name|last_song|
// +-------+---------+
// |beatles|     jude|
// |  romeo|      mia|
// |  elvis|  example|
// +-------+---------+
票数 5
EN

Stack Overflow用户

发布于 2019-08-06 02:41:22

还可以使用UDF,如下所示:

代码语言:javascript
运行
复制
val lastElementUDF = udf((array: Seq[String]) => array.lastOption)

actualDF.withColumn("hit_songs", lastElementUDF($"hit_songs"))

array.lastOption将返回NoneSome,如果数组为空,array.last将抛出异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50592990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档