Scala Spark:如何查询列中的数组?

Scala Spark:如何查询列中的数组?,scala,apache-spark,Scala,Apache Spark,拜托,我是Spark的新手(也是Stackoverflow)。对于下面的RDD和DataFrame(相同的数据),我希望获得超过N个视频的播放列表中浏览次数最多的标签。我的问题是标签在一个数组中,另外,我不知道从哪里开始,因为它看起来很高级 RDD 数据帧 预期结果 包含超过(N=65)个视频的播放列表的标签 下面是一个使用数据帧的解决方案: import org.apache.spark.sql.functions._ import spark.implicits._ val N = 65

拜托,我是Spark的新手(也是Stackoverflow)。对于下面的RDD和DataFrame(相同的数据),我希望获得超过N个视频的播放列表中浏览次数最多的标签。我的问题是标签在一个数组中,另外,我不知道从哪里开始,因为它看起来很高级

RDD 数据帧 预期结果 包含超过(N=65)个视频的播放列表的标签


下面是一个使用数据帧的解决方案:

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

val N = 65

val result = df.where($"videos" > N)           // filter playlists with enough views
  .select(explode($"tags") as "tag", $"views") // explode tags into separate records
  .groupBy("tag")                              // group by tag
  .sum("views")                                // sum views per tag

result.show(false)
// +---+----------+
// |tag|sum(views)|
// +---+----------+
// |t5 |553       |
// |t4 |1015      |
// |t2 |1015      |
// |t6 |462       |
// +---+----------+
对于RDD:

// given 
val rdd: RDD[(Int, String, Array[String], Int, Int)] = ???

val N = 65

val result: RDD[(String, Int)] = rdd
  .filter(_._4 > N)
  .flatMap { case (_, _, tags, _, views) => tags.map(tag => (tag, views)) }
  .reduceByKey(_ + _)

欢迎来到StackOverflow!对于给定的示例,您能否编辑帖子以包含预期结果?您的描述(
播放列表中超过N个视频的浏览次数最多的标签
)有些模糊,举个例子可以帮助您解决任何歧义。根据OP对所需结果的描述添加了一个表,“浏览次数最多的标签[用于](播放列表中超过N个视频)”!请你帮帮忙@TzachZoharThanks很多@Tzach,有没有办法用RDD实现它,因为我想知道区别…添加了RDD解决方案,但我建议你阅读RDD API的文档,它应该为你提供了解这种类型转换所需的一切。好的,我会试一试。顺便说一句,对于数据帧,我得到了重复的标记(例如,t2具有X和视图,t2具有Y和视图,而我希望t2 | X+Y)哦,我解决了,我只需要在分割后删除空格;)
+-----+-------+
| tag | views |
+-----+-------+
| t2  | 1015  |
| t4  | 1015  |
| t5  | 553   |
| t6  | 462   |
+-----+-------+
import org.apache.spark.sql.functions._
import spark.implicits._

val N = 65

val result = df.where($"videos" > N)           // filter playlists with enough views
  .select(explode($"tags") as "tag", $"views") // explode tags into separate records
  .groupBy("tag")                              // group by tag
  .sum("views")                                // sum views per tag

result.show(false)
// +---+----------+
// |tag|sum(views)|
// +---+----------+
// |t5 |553       |
// |t4 |1015      |
// |t2 |1015      |
// |t6 |462       |
// +---+----------+
// given 
val rdd: RDD[(Int, String, Array[String], Int, Int)] = ???

val N = 65

val result: RDD[(String, Int)] = rdd
  .filter(_._4 > N)
  .flatMap { case (_, _, tags, _, views) => tags.map(tag => (tag, views)) }
  .reduceByKey(_ + _)