gpt4 book ai didi

scala - RDD 中的 MapValues 和 Explode

转载 作者:行者123 更新时间:2023-12-05 01:45:58 24 4
gpt4 key购买 nike

我在下面有这个示例 RDD(下面称为 rdd)。数据集是 (String, Int) 的元组:

(some | random | value, 10)
(some | random | value, 11)
(some | random | value, 12)

我想得到这个输出:

(some, 10)
(random, 10)
(value, 10)
(some, 11)
(random, 11)
(value, 11)
(some, 12)
(random, 12)
(value, 12)

我有这个 Scala 代码来尝试上述转换:

rdd.map(tuple => tuple._1.split("|").foreach(elemInArray => (elemInArray, tuple._2)))

在这段代码中,我遍历了整个数据集,并将元组的第一部分拆分为 |。然后,我遍历 split 返回的数组中的每个元素,并使用每个 element 和我从 tuple._1 获得的计数创建一个元组.

出于某种原因,我一直得到这个结果:

()
()
()
()
()
()
()
()
()

有人知道这个问题吗?我似乎找不到哪里出错了。

最佳答案

你实际上需要为此使用 flatMap:

val lt = List(("some | random | value", 10),
("some | random | value", 11),
("some | random | value", 12))

val convert: ((String, Int)) => List[(String, Int)] = tuple => tuple._1.split('|').map(str =>
(str, tuple._2)).toList

val t = lt.flatMap(convert)

如我们所见,定义convert 函数非常有用,因为我们可以通过向该函数传递单个元素来确保正确处理每个元素。然后我们可以将相同的函数传递给 flatMap,它会将 convert 生成的结果列表聚合到一个列表中。

以上结果:

t: List[(String, Int)] = List((some ,10), 
( random ,10),
( value,10),
(some ,11),
( random ,11),
( value,11),
(some ,12),
( random ,12),
( value,12))

显然,我没有费心去处理结果中多余的空白字符,但这很容易通过使用 trim 更新您的 convert 函数来处理:

val convert: ((String, Int)) => List[(String, Int)] = tuple => tuple._1.split('|').map(str =>
(str.trim, tuple._2)).toList

关于scala - RDD 中的 MapValues 和 Explode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39005801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com