2015-05-14 197 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()'... –