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