2015-03-31 91 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