在 Spark Scala 中使用 map() 重新排序键值对

Posted

技术标签:

【中文标题】在 Spark Scala 中使用 map() 重新排序键值对【英文标题】:Reorder Key-Value Pairs using map() in Spark Scala 【发布时间】:2016-09-06 04:04:08 【问题描述】:

以下 pySpark 代码在 Spark-Scala 中的等价物是什么?

rddKeyTwoVal = sc.parallelize([("cat", (0,1)), ("spoon", (2,3))])
rddK2VReorder = rddKeyTwoVal.map(lambda (key, (val1, val2)) : ((key, val1) ,
val2))
rddK2VReorder.collect()
// [(('cat', 0), 1), (('spoon', 2), 3)] -- This is the output. 

【问题讨论】:

【参考方案1】:
val rddKeyTwoVal = sc.parallelize(Seq(("cat", (0,1)), ("spoon", (2,3))))
val rddK2VReorder = rddKeyTwoVal.mapcase (key, (val1, val2)) => ((key, val1), val2)
rddK2VReorder.collect

val rddKeyTwoVal = sc.parallelize(Seq(("cat", (0,1)), ("spoon", (2,3))))
val rddK2VReorder = rddKeyTwoVal.map(r=> ((r._1, r._2._1),r._2._2))
rddK2VReorder.collect

输出:

 Array(((cat,0),1), ((spoon,2),3))

感谢@Alec 提出第一种方法

【讨论】:

虽然rddKeyTwoVal.map case (key, (val1, val2)) => ((key, val1), val2) 可能是 lambda 的更简洁的翻译... 感谢您的及时输入!看起来我们都在同一时间找到了相同的答案。 :)【参考方案2】:

我找到了自己的答案!发布以帮助社区的其他人。这是我上面发布的代码的最干净的 Scala 版本。产生完全相同的输出。

val rddKeyTwoVal = sc.parallelize(Array(("cat", (0,1)), ("spoon", (2,3))))
val rddK2VReorder = rddKeyTwoVal.mapcase (key, (val1, val2)) => ((key, val1),val2)

rddK2VReorder.collect()

//Use the following for a cleaner output. 
rddK2VReorder.collect().foreach(println) 

输出:

// With collect() menthod.

Array[((String, Int), Int)] = Array(((cat,0),1), ((spoon,2),3))

// If you use the collect().foreach(println)
((cat,0),1)
((spoon,2),3)

【讨论】:

这和@shekhar 的回答完全一样...事实上,稍微不太正确,因为从技术上讲,你没有在 Python 版本中打印输出,你只是收集了它。 谢谢。我已经修改了答案。

以上是关于在 Spark Scala 中使用 map() 重新排序键值对的主要内容,如果未能解决你的问题,请参考以下文章

并行使用 scala Spark 重命名 HDFS 文件时的序列化问题

如何在 spark scala 中重命名 S3 文件而不是 HDFS

将 Spark Dataframe 转换为 Scala Map 集合

将Spark Dataframe转换为Scala Map集合

通过Map Spark Scala循环

spark dataframe 和 scala Map互相转换