我对spark(和编程)很陌生,所以如果你能帮助我理解这两个输出之间的区别,那就太好了。
map()
>>> data = ['1', '2', '3', '4', '5', 'one', 'two']
>>> distData = sc.parallelize(data)
>>> maping = distData.map(lambda x: x.split())
>>> maping.collect()
[['1'], ['2'], ['3'], ['4'], ['5'], ['one'], ['two']]
>>> for i in maping.take(100): print(i)
...
['1']
['2']
['3']
['4']
['5']
['one']
['two']
FlatMap()
>>> maping = distData.flatMap(lambda x: x.split())
>>> maping.collect()
['1', '2', '3', '4', '5', 'one', 'two']
>>> for i in maping.take(100): print(i)
...
1
2
3
4
5
one
two
map
函数是一对多转换,而flatmap
函数是一对零或多转换。
根据文件,
map(func):返回一个新的分布式数据集,该数据集通过一个函数func传递源的每个元素而形成。
flatMap(func):与map类似,但每个输入项都可以映射到0个或更多的输出项(因此func应该返回一个Seq而不是单个项)。
您可以说,对于每个输入值,flatmap
输出一个sequence
,该sequence
可以有0个或多个元素,这些元素被平坦化以形成输出RDD。
请参考这个SO问题,它演示了一个很好的用例。
有人能给我解释一下map和flatMap之间的区别,以及什么是各自的好用例吗? “结果扁平化”是什么意思?它有什么好处?
在Java 8中,和方法有什么区别?
问题内容: 在Java 8中,和方法之间有什么区别? 问题答案: 双方map并可以应用到他们都回报。不同之处在于,该map运算为每个输入值生成一个输出值,而该运算为每个输入值生成任意数量(零个或多个)的值。 这反映在每个操作的参数中。 该map操作采用一个,对输入流中的每个值调用,并产生一个结果值,该结果值发送到输出流。 该操作采用的功能在概念上要消耗一个值并产生任意数量的值。但是,在Java中,
问题内容: 似乎这两个功能非常相似。它们具有相同的签名(接受),并且它们的大理石图看起来完全相同。无法在此处粘贴图片,但这是用于concatMap的图片,这是用于flatMap的图片。在结果的描述中似乎存在一些细微的差异,其中所产生的包含通过合并产生的可观察变量产生的项目,而所产生的包含通过首先合并所产生的可观察变量并发出合并结果而产生的项目。 但是,这种微妙之处对我来说还不清楚。任何人都可以更好
switchmap的rxjava文档定义相当模糊,它链接到与FlatMap相同的页面。这两个操作员有什么不同?
问题内容: 我有一个地图,该地图将同时被多个线程修改。 Java API中似乎有三种不同的同步Map实现: Hashtable Collections.synchronizedMap(Map) ConcurrentHashMap 据我了解,这是一个旧的实现(扩展了过时的类),后来对其进行了修改以适合该Map接口。虽然它是同步的,但似乎存在严重的可伸缩性问题,因此不建议用于新项目。 但是其他两个呢?