使用Scala从Array(使用Scary改变大小的Array [String)创建元组
你的问题的核心与分离内部数组的头部(第一个元素)和尾部(剩余元素)有关,你可以使用head和tail方法。RDD的行为与Scala列表非常相似,因此您可以使用纯Scala代码完成所有操作。
给出以下输入RDD:
val input: RDD[Array[Array[String]]] = sc.parallelize(
Seq(
Array(
Array("122abc","223cde","334vbn","445das"),
Array("221bca","321dsa"),
Array("231dsa","653asd","698poq","897qwa")
)
)
)
以下应该做你想要的:
val output: RDD[(String,String)] =
input.flatMap { arrArrStr: Array[Array[String]] =>
arrArrStr.flatMap { arrStrs: Array[String] =>
arrStrs.tail.map { value => arrStrs.head -> value }
}
}
事实上,由于flatMap/ map是如何编写的,你可以将其重新编写为for-comprehension:
val output: RDD[(String,String)] =
for {
arrArrStr: Array[Array[String]] <- input
arrStr: Array[String] <- arrArrStr
str: String <- arrStr.tail
} yield (arrStr.head -> str)
你选择哪一个最终是个人偏好的问题(虽然在这种情况下,我更喜欢后者,因为你不必像往常一样缩进代码)。
验证:
output.collect().foreach(println)
应打印出来:
(122abc,223cde)
(122abc,334vbn)
(122abc,445das)
(221bca,321dsa)
(231dsa,653asd)
(231dsa,698poq)
(231dsa,897qwa)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。