map()和flatMap()的区别
map将函数作用到数据集的每一个元素上,生成一个新的分布式的数据集(RDD)返回
flatMap会先执行map的操作,再将所有对象合并为一个对象,返回值是一个Sequence
flatMap() 的一个简单用途是把输入的字符串切分为单词
3.5.1 基本RDD
首先来讲讲哪些转化操作和行动操作受任意数据类型的 RDD 支持。
1. 针对各个元素的转化操作
你很可能会用到的两个最常用的转化操作是 map() 和 filter()(见图 3-2)。转化操作
map() 接收一个函数,把这个函数用于 RDD 中的每个元素,将函数的返回结果作为结果
RDD 中对应元素的值。而转化操作 filter() 则接收一个函数,并将 RDD 中满足该函数的
元素放入新的 RDD 中返回。
例 3-26:Python 版计算 RDD 中各值的平方
nums = sc.parallelize([1, 2, 3, 4])
squared = nums.map(lambda x: x * x).collect()
for num in squared:
print "%i " % (num)
有时候,我们希望对每个输入元素生成多个输出元素。 flatMap()
实现该功能的操作叫作 flatMap()。 和 map() 类似,我们提供给 flatMap() 的函数被分别应用到了输入 RDD 的每个元素上。不
过返回的不是一个元素,而是一个返回值序列的迭代器。输出的 RDD 倒不是由迭代器组
成的。我们得到的是一个包含各个迭代器可访问的所有元素的 RDD。flatMap() 的一个简
单用途是把输入的字符串切分为单词,
你可以把 flatMap() 看作将返回的迭代器
“拍扁”,这样就得到了一个由各列表中的元素组成的 RDD,而不是一个由列表组成的 RDD
#方法2需要复制这三行
import findspark
findspark.init()
import pyspark
import sys
from pyspark import SparkConf, SparkContext
if __name__ == "__main__":
# master = "local"
if len(sys.argv) == 2:
master = sys.argv[1]
# 在 Python 中初始化 Spark
conf = SparkConf().setMaster("local").setAppName("My App")
sc = SparkContext(conf = conf)
# 通过sc.parallelize可以把Python list,NumPy array或者Pandas Series,Pandas DataFrame转成Spark的RDD数据。
lines = sc.parallelize(["hello world", "hi"])
words = lines.flatMap( lambda line : line.split(" ") )
words.first()
print(words.first())