2015-03-31 35 views
1

它看起來像map和flatMap返回不同的類型。Spark map和flatMap結果類型

mySchamaRdd.map(p => Row.fromSeq(...))返回org.apache.spark.rdd.RDD [org.apache.spark。這是applySchema函數(或spark 1.3中的createDataFrame)所必需的。

但是,mySchamaRdd.flatMap(p => Row.fromSeq(...)返回org.apache.spark.rdd.RDD [任何],我無法調用applySchema()。

如何在flatMap()之後使用applySchema()?

一個例子(輸入模式:名稱,描述)

Bob, "Software developer" 
John, "I like spaghetti" 

結果:

Bob, Software 
Bob, Developer 
John, I 
John, like 
John, spaghetti 
+1

爲什麼你必須使用flatMap如果你的地圖函數返回一個標量?如果您可能會爲每個傳入記錄從地圖函數輸出多個或偶爾沒有記錄,則flatMap非常有用。 – 2015-03-31 07:25:38

+0

對於每一行我想返回多行。這就像文字標記器。 爲表名稱的一個例子,AboutMe 鮑勃, 「軟件開發」 約翰, 「我喜歡意大利麪條」 結果: 鮑勃,軟件 鮑勃,開發 約翰,我 約翰一樣, John,意大利麪條 – 2015-03-31 07:53:09

+0

@Dmitry如果將'flatMap'的映射嵌入到'Seq'中怎麼辦?像這樣的'mySchamaRdd.flatMap(p => Seq(Row.fromSeq(...)))'? – ale64bit 2015-03-31 08:05:57

回答

0

也許我誤會你創建你的SchemaRDD的方式,也許你誤解flatMap是應該的方式上班。你試過這個嗎?

mySchemaRDD.flatMap(p => p.getString(1).split(" +").map(x => Row((p.getString(0), x)))) 

我認爲mySchamaRdd.flatMap(p => Row.fromSeq(...))是不恰當使用flatMap,因爲你應該返回的東西嵌入在一些序列,以它並提取你真的想回到什麼。在你的情況下,你是嵌入它在,而你想要返回的結果類型是本身。

+0

我想再添加一列到一個非常大的模式。我使用'map(word => p:+ word)'(在最後的地圖中)。它看起來像這個代碼返回Seq 這是問題的根源。添加Row:'map(word => Row(p:+ word))後,它可以正常工作。感謝您的幫助! – 2015-03-31 08:46:40

+0

不客氣:) – ale64bit 2015-03-31 08:51:21

+0

PS:另一種解決方案 - 在rowMap後使用flatMap中的另一個map():'mySchamaRdd.flatMap(p => Row.fromSeq(...)。map(Row(_))' – 2015-03-31 08:54:56