使用对 [Key,Value From List1],[Key,ValueFrom List2] 将 RDD[Key,List[Value]] 转换为 RDD

Posted

技术标签:

【中文标题】使用对 [Key,Value From List1],[Key,ValueFrom List2] 将 RDD[Key,List[Value]] 转换为 RDD【英文标题】:Convert RDD[Key,List[Value]] into RDD with pairs [Key,ValueFromList1],[Key,ValueFromList2] 【发布时间】:2017-11-24 19:55:13 【问题描述】:

我是 Spark 和转换的新手,所以需要一点帮助。我设法找到了相反的解决方案。当您将值放入列表而不是从中提取时。我想“扁平化”我猜密钥的值。我有一个类似 Map 的 RDD,其中键是 Int,值是字符串列表。我需要将列表中的 Key 和每个 Value 配对成一个 RDD。

【问题讨论】:

【参考方案1】:

你可以使用 flatMap,然后像这样将每个元素映射到一个元组

val flattenedRDD = pairRDD.flatMap  case (i,l)  => l.map( l => (i,l)) 

【讨论】:

嘿迈克,你提供的解决方案应该有效。但现在我在铸造方面遇到了问题。 Caused by: java.lang.ClassCastException: org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema cannot be cast to java.lang.String 是否有可能在平面地图行中正确投射? 我不确定,但至少在您的代码失败时,我必须查看它 我不相信数据类型就是你所说的那样。如果你发布你的 sn-p 我可以帮助你 //loading into data frame val matchesRDD = MongoSpark.load[Match](spark, readConfig) //making DF [Boolean,Seq[Player]] val tuplesArrayIGuess = matchesRDD .rdd .map(elem => (elem.getAs[Boolean]("radiantWin"), elem.getAs[Seq[PlayerMongo]]("players"))) //and code you've suggested. it's failing on case line. tuplesArrayIGuess.flatMap( case (i,l) => l.map( l => (i,l)) ) 希望这会有所帮助。抱歉编辑风格。无法在评论部分以任何其他方式进行 发现了问题(我猜)。当按名称从字段中获取值时,此转换不起作用,但按索引完美工作。感谢@mike 的帮助

以上是关于使用对 [Key,Value From List1],[Key,ValueFrom List2] 将 RDD[Key,List[Value]] 转换为 RDD的主要内容,如果未能解决你的问题,请参考以下文章

第三周

0427每日练习

代码分享用redis+lua实现多个集合取交集并过滤,类似于: select key from set2 where key in (select key from set1) and value(代

select `key`,`value` ---sql语句

多字典同key时对value加法操作

python列表题?