scala - scala - 使用地图列表传播rdd
问题描述
我想使用列表地图传播 rdd。
输入样本是
Log("key1", "key2", "key3", Map(tk1 -> tv1, tk2 -> tv2, tk3 -> tv3))
我想要的输出样本是
RDD[(String, String, String, String, String)]
("key1", "key2", "key3", "tk1", "tv1")
("key1", "key2", "key3", "tk2", "tv2")
("key1", "key2", "key3", "tk3", "tv3")
最后,我想做如下图的reduce操作。但它不起作用。
val mapCnt = logs.map(log => {
log.textMap.foreach { tmap =>
var tkey = tmap._1
var tvalue = tmap._2
}
((log.key1, log.key2, log.key3, tkey, tvalue), 1L)
}).reduceByKey(_ + _)
这是我使用的输入对象。
case class Log(
val key1: String,
val key2: String,
val key3: String,
val TextMap: Map[String, String]
)
我该如何改变这个?
谢谢您的帮助。
解决方案
您计算结果foreach
并立即丢弃它们。此外,这些值超出了范围。最好在flatMap
这里使用。
val mapCnt = logs.flatMap(log => {
for {
(tkey, tvalue) <- tmap
} yield ((log.key1, log.key2, log.key3, tkey, tvalue), 1L)
}).reduceByKey(_ + _)
推荐阅读
- javascript - Firebase 分析测试
- laravel - Laravel 生成基本身份验证
- java - 找不到 Spring Bean
- javascript - 如何在浏览器中将 m3u8 URL 转换为 mp4 可下载文件?
- c - 我为 Visual Studio 代码安装了 vcpkg-master 并安装了他们的包,之后只有我的 Clion 停止工作
- css - VSCode 智能感知充斥着 typescript 中的 css 类
- go - 类型与 []byte 属性上的投影不匹配
- javascript - 电子工作者:隐藏的 BrowserWindow 导致前端滞后
- bash - Bash 脚本:如何从文件中读取作为参数传递的行,并将其存储在变量中
- android - 如何将经过的时间从现在转换为该日期并将该方法传递给kotlin中的viewholder