2015-05-14 148 views
1

我有一个单独的字符串值的Spark RDD,其中每个字符串由|符号分隔的单词形成。令牌字符串在“字符串RDD”返回另一个RDD

此RDD由SparkSQL查询生成,而不是由.textFile(...)加载操作生成。

我不能(除非我想知道一些基本的东西)使用.flatMap(_.split("|"))操作,因为这会在应用.split()之前将每个字符串变为单个字符。

但是,我确实需要做一些事情,比如.flatMap(),因为我需要一对多的映射。由于我的数据集可能非常大,我需要此操作进行并行化,因此需要使用RDD和相关操作。

有趣的是,在使用.textFile(...)加载RDDs处理字符串时,.flatMap(...)操作完全符合我的要求!所以我猜测,必须有一种方法...

任何帮助或建议将不胜感激!

谢谢!

+0

>>因为这会在应用.split()之前将每个字符串压扁为单个字符为什么你这么认为? – ipoteka

+0

对不起,这是错的!我让自己感到困惑。这是由于我在'|'符号上分裂而引起的,现在我意识到这将被解释为REGEX或操作。所以我正在有效地分割''''这当然最终会给我个人角色!!所以,如果我使用'“”“\ |”“”',那么一切都按预期工作。对不起,谢谢! –

回答

2

嗯,我不知道我明白这个问题,但我会尽力帮忙。

.flatMap(_.split("|"))拆分打破了每一行的单词,并在最后它被夷为平地。如果你不需要平坦的结果,也许你可以使用.map(_.split("|"))

+0

在由.textFile()加载生成的RDD上,当与适当的.split()一起使用时,.flatMap()操作将字符串拆分为单词。但是,我认为这些都是特殊的,因为在其他字符串RDD上,.flatmap()首先将字符串扁平化为字符,然后应用提供的函数。如您所建议的那样使用.map()将复合字符串映射到令牌数组。我希望能够生成一个只包含令牌的RDD,而不是它们的数组。 –

+1

'flatMap'应该适用于你的情况。尝试在计算结束时使用这个:'x.flatMap(y => y)'来展平。结果是什么? –

+1

我已经试过了,'.flatMap(y => y)'将每个字符串变为其组成字符但是,我已经设法通过使用'.mapPartions()'来实现我的最终结果。在这里,我使用提供的迭代器遍历RDD中的字符串,然后将每个字符串标记为一个缓冲区。我返回缓冲区的迭代器,即DIY flatMap()'... –