零基础入门大数据挖掘之spark中的几种map

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/on2way/article/details/84348222

今天再来说一下spark里面的几种map方法。前面的文章介绍过单纯的map,但是spark还有几种map值得对比一下,主要是下面几种:

  • map:普通的map
  • flatMap:在普通map的基础上多了一个操作,扁平化操作;
  • mapPartitions:相对于分区Partition而言的,即对每个分区分别进行一次性的map。
  • mapValues(function) :适合key-value对的map操作。
  • flatMapValues(function) :同样适合key-value对的map操作,与mapValues略有不同。

这几类都是实现输入输出一对一型的,即输入一个东西,输出一个东西。

(1)普通的map比较简单,假设一个文本:

hello world
a new line
hello
...
the end

如果我想对每一行进行空格分割,返回的依然是个矩阵的话,就是一般的map方法:

val arr=sc.parallelize(Array("hello world","a new line","the end"))
val res = arr.map(x=>x.split(" "))

得到的结果就会是这样的:

[[hello],[world] ;
[a], [new], [line] ;
[the], [end]]

也就是每一行独立进行执行分割,得到的结果也相互独立;

(2)flatMap,在普通map后面再进行压平,所谓压平,就是把每一行得到的结果进行串联成一行。比如上面map后本来有三行结果的,每行结果里面又有分割的结果,flatMap后就只有一行。

val arr=sc.parallelize(Array("hello world","a new line","the end"))
val res = arr.flatMap(x=>x.split(" "))

得到的结果就是下面这样:

[[hello],[world], [a], [new], [line], [the], [end]]

这就是压平。

(3)mapPartitions,是一种分区进行的map操作。

理解这个之前,先理解分区Partitions的概念。所谓分区,就是分布式存储的,整个数据不是存在一台机器上,而是分散存在好几台机器上的不同区域,就是分区。而mapPartitions就是对每个分区单独处理,每个分区中又是进行统一的读入内存,然后一次性处理的。

来看一下map是怎么操作的,map虽然也是分布式处理的,但是是一条条读入内存,处理完以后出内存存结果。而mapPartitions是一个分区中一次性读入内存,然后一起一个map处理,节省了很多单次读内存的操作,相对来说速度更快。

当数据量很大,又有很多分区的时候,mapPartitions的速度是更快的,但是有一个前提是每一个小分区的量不能太大,必须保证小分区可以一次性全部读入自己机器的内存,如果不满足这个条件,mapPartitions将报错。而对比来说map就没有这个问题,反正map是一条一条的进行分布式处理的。

(4)mapValues(function) :该函数只适用于key-value对形式的数据。对里面每一对数据,保持key不变,对value进行function函数处理,得到的结果与key形成新的key-value对。所以该函数返回也是key-value对。比如:

>>> x = sc.parallelize([("a", ["apple", "banana", "lemon"]), ("b", ["grapes"])])
>>> def f(x): return len(x)
>>> x.mapValues(f).collect()
    [('a', 3), ('b', 1)]

(5)flatMapValues(function):flatMapValues类似于mapValues,不同的在于flatMapValues应用于元素为key-value对的RDD中Value,每个一元素的Value被输入函数f映射为一系列的值,然后这些值再与原RDD中的Key组成一系列新的key-value对。所以与mapValues最大的区别是,mapValues每一对输出是一对,而flatMapValues每一对输出可不止一对,可以是很多对。

>>> x = sc.parallelize([("a", ["x", "y", "z"]), ("b", ["p", "r"])])
    >>> def f(x): return x
    >>> x.flatMapValues(f).collect()
    [('a', 'x'), ('a', 'y'), ('a', 'z'), ('b', 'p'), ('b', 'r')]

关注公号【AInewworld】,第一时间获取精彩内容
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/on2way/article/details/84348222
今日推荐