首页 > spark 的 map 和 flatMap 应该怎样理解?

spark 的 map 和 flatMap 应该怎样理解?

conf = SparkConf().setAppName("Simple App").setMaster("local")
sc = SparkContext(conf=conf)
file = "./README.md"
“”“
  111 aaa bcd
  22 qqq www
”“”
dataFile = sc.textFile(file)
test = dataFile.map(lambda s : s)
print test.collect()  # [u'111 aaa bcd', u'22 qqq www'] 
test = dataFile.flatMap(lambda s : s)  
print test.collect()  # [u'1', u'1', u'1', u' ', u'a', u'a', u'a', u' ', u'b', u'c', u'd', u'2', u'2', u' ', u'q', u'q', u'q', u' ', u'w', u'w', u'w'

map文档是这样解释的:Return a new distributed dataset formed by passing each element of the source through a function func.
我的理解是对rdd的每一个element进行func,最后返回的数量应该是等于element的数量的。

flatMap是这样解释:Similar to map, but each input item can be mapped to 0 or more output items (so func should return a Seq rather than a single item).

这里不懂为什么flatMap结果是一个个字母?


map操作我记得的有map(一条对一条),mapToPair(map成键值对),flatMap(一条记录变n条(n>=0))。你可以看看官方的wordCount demo,对flatMap的功能解释得很详尽了


flatMap就是先map再flat,在你的例子中,flatMap第一步会得到和map一样的结果:

[u'111 aaa bcd', u'22 qqq www']

第二步会针对里面每一项作flat,这时候每一项都得是可迭代的,而python里面字符串是可迭代的,spark会执行类似于下面的迭代操作

for c in '111 aaa bcd':
    print c

这样就得到了最后一个个字符的结果

如果某项是不可迭代的,比如只是个数字1,那么会报错的,你可以试试

【热门文章】
【热门文章】