Spark算子 - Python (二)

仅供交流学习使用!

第6关:Transformation - sortBy

100

任务要求
参考答案
评论4

任务描述
相关知识
    sortBy
    sortBy 案例
编程要求
测试说明

任务描述

本关任务:使用 Spark 的 SortBy 算子按照相关需求完成相关操作。
相关知识

为了完成本关任务,你需要掌握:如何使用 sortBy 算子。
sortBy

sortBy 函数是在 org.apache.spark.rdd.RDD 类中实现的,它的实现如下:

    def sortBy(self, keyfunc, ascending=True, numPartitions=None):
        return self.keyBy(keyfunc).sortByKey(ascending, numPartitions).values()

该函数最多可以传三个参数:

第一个参数是一个函数,排序规则;
第二个参数是 ascending ,从字面的意思大家应该可以猜到,是的,这参数决定排序后 RDD 中的元素是升序还是降序,默认是 true ,也就是升序;
第三个参数是 numPartitions ,该参数决定排序后的 RDD 的分区个数,默认排序后的分区个数和排序之前的个数相等,即为this.partitions.size。

从sortBy函数的实现可以看出,第一个参数是必须传入的,而后面的两个参数可以不传入。
sortBy 案例

    sc = SparkContext("local", "Simple App")
    data = [("a",1),("a",2),("c",1),("b",1)]
    rdd = sc.parallelize(data)
    by = rdd.sortBy(lambda x: x)
    print(by.collect())

输出:

[('a', 1), ('a', 2), ('b', 1), ('c', 1)]

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

需求:使用 sortBy 算子,将 rdd 中的数据进行排序(升序)。
测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

开始你的任务吧,祝你成功!

# -*- coding: UTF-8 -*-
from pyspark import SparkContext

if __name__ == "__main__":
     # ********** Begin **********#
    # 1.初始化 SparkContext,该对象是 Spark 程序的入口
    sc = SparkContext("local", "Simple App")
    # 2.创建一个内容为(1, 3, 5, 7, 9, 8, 6, 4, 2)的列表List
    data = [1, 3, 5, 7, 9, 8, 6, 4, 2]
    # 3.通过 SparkContext 并行化创建 rdd
    rdd = sc.parallelize(data)
    # 4.使用rdd.collect() 收集 rdd 的元素
    print(rdd.collect())
    """
       使用 sortBy 算子,将 rdd 的数据 (1, 3, 5, 7, 9, 8, 6, 4, 2) 按照下面的规则进行转换操作,规则如下:
       需求:
           元素排序,例如:
            5,4,3,1,2  --> 1,2,3,4,5
       """
    # 5.使用 sortBy 算子完成以上需求
    sort_result = rdd.sortBy(lambda x: x)
    # 6.使用rdd.collect() 收集完成 sortBy 转换的元素
    print(sort_result.collect())
    # 7.停止 SparkContext
    sc.stop()
    #********** End **********#

第7关:Transformation - sortByKey

100

任务要求
参考答案
评论4

任务描述
相关知识
    sortByKey
    sortByKey 案例
编程要求
测试说明

任务描述

本关任务:使用 Spark 的 sortByKey 算子按照相关需求完成相关操作。
相关知识

为了完成本关任务,你需要掌握:如何使用 sortByKey 算子。
sortByKey

    def sortByKey(self, ascending=True, numPartitions=None, keyfunc=lambda x: x):
        if numPartitions is None:
            numPartitions = self._defaultReducePartitions()
        memory = self._memory_limit()
        serializer = self._jrdd_deserializer
        def sortPartition(iterator):
            sort = ExternalSorter(memory * 0.9, serializer).sorted
            return iter(sort(iterator, key=lambda kv: keyfunc(kv[0]), reverse=(not ascending)))
        if numPartitions == 1:
            if self.getNumPartitions() > 1:
                self = self.coalesce(1)
            return self.mapPartitions(sortPartition, True)
        # first compute the boundary of each part via sampling: we want to partition
        # the key-space into bins such that the bins have roughly the same
        # number of (key, value) pairs falling into them
        rddSize = self.count()
        if not rddSize:
            return self  # empty RDD
        maxSampleSize = numPartitions * 20.0  # constant from Spark's RangePartitioner
        f\fraction = min(maxSampleSize / max(rddSize, 1), 1.0)
        samples = self.sample(False, f\fraction, 1).map(lambda kv: kv[0]).collect()
        samples = sorted(samples, key=keyfunc)
        # we have numPartitions many parts but one of the them has
        # an implicit boundary
        bounds = [samples[int(len(samples) * (i + 1) / numPartitions)]
                  for i in range(0, numPartitions - 1)]
        def rangePartitioner(k):
            p = bisect.bisect_left(bounds, keyfunc(k))
            if ascending:
                return p
            else:
                return numPartitions - 1 - p
        return self.partitionBy(numPartitions, rangePartitioner).mapPartitions(sortPartition, True)

说明:ascending参数是指排序(升序还是降序),默认是升序。numPartitions参数是重新分区,默认与上一个RDD保持一致。keyfunc参数是排序规则。
sortByKey 案例

    sc = SparkContext("local", "Simple App")
    data = [("a",1),("a",2),("c",1),("b",1)]
    rdd = sc.parallelize(data)
    key = rdd.sortByKey()
    print(key.collect())

输出:

[('a', 1), ('a', 2), ('b', 1), ('c', 1)]

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

需求:使用 sortBy 算子,将 rdd 中的数据进行排序(升序)。
测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

开始你的任务吧,祝你成功!

# -*- coding: UTF-8 -*-
from pyspark import SparkContext

if __name__ == "__main__":
   # ********** Begin **********#
    # 1.初始化 SparkContext,该对象是 Spark 程序的入口
    sc = SparkContext("local", "Simple App")
    # 2.创建一个内容为[(B',1),('A',2),('C',3)]的列表List
    data = [('B', 1), ('A', 2), ('C', 3)]
    # 3.通过 SparkContext 并行化创建 rdd
    rdd = sc.parallelize(data)
    # 4.使用rdd.collect() 收集 rdd 的元素
    print(rdd.collect())
    """
       使用 sortByKey 算子,将 rdd 的数据 ('B', 1), ('A', 2), ('C', 3) 按照下面的规则进行转换操作,规则如下:
       需求:
           元素排序,例如:
            [(3,3),(2,2),(1,1)]  -->  [(1,1),(2,2),(3,3)]
       """
    # 5.使用 sortByKey 算子完成以上需求
    sort_by_key = rdd.sortByKey()
    # 6.使用rdd.collect() 收集完成 sortByKey 转换的元素
    print(sort_by_key.collect())
    # 7.停止 SparkContext
    sc.stop()
    # ********** End **********#

第8关:Transformation - mapValues

100

任务要求
参考答案
评论4

任务描述
相关知识
    mapValues
    mapValues 案例
编程要求
测试说明

任务描述

本关任务:使用Spark 的 mapValues 算子按照相关需求完成转换操作。
相关知识

为了完成本关任务,你需要掌握:如何使用 mapValues 算子。
mapValues

mapValues :针对(Key, Value)型数据中的 Value 进行 Map 操作,而不对 Key 进行处理。

上图中的方框代表 RDD 分区。 a=>a+2 代表对 (V1,1) 这样的 Key Value 数据对,数据只对 Value 中的 1 进行加 2 操作,返回结果为 3。
mapValues 案例

    sc = SparkContext("local", "Simple App")
    data = [("a",1),("a",2),("b",1)]
    rdd = sc.parallelize(data)
    values = rdd.mapValues(lambda x: x + 2)
    print(values.collect())

输出:

[('a', 3), ('a', 4), ('b', 3)]

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

需求:使用mapValues算子,将rdd的数据 (“1”, 1), (“2”, 2), (“3”, 3), (“4”, 4), (“5”, 5) 按照下面的规则进行转换操作,规则如下:

偶数转换成该数的平方
奇数转换成该数的立方

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

开始你的任务吧,祝你成功!

# -*- coding: UTF-8 -*-
from pyspark import SparkContext

if __name__ == "__main__":
   # ********** Begin **********#
    # 1.初始化 SparkContext,该对象是 Spark 程序的入口
    sc = SparkContext("local", "Simple App")
    # 2.创建一个内容为[("1", 1), ("2", 2), ("3", 3), ("4", 4), ("5", 5)]的列表List
    data = [("1", 1), ("2", 2), ("3", 3), ("4", 4), ("5", 5)]
    # 3.通过 SparkContext 并行化创建 rdd
    rdd = sc.parallelize(data)
    # 4.使用rdd.collect() 收集 rdd 的元素
    print(rdd.collect())
    """
           使用 mapValues 算子,将 rdd 的数据 ("1", 1), ("2", 2), ("3", 3), ("4", 4), ("5", 5) 按照下面的规则进行转换操作,规则如下:
           需求:
               元素(key,value)的value进行以下操作:
                                                偶数转换成该数的平方
                                                奇数转换成该数的立方
    """
    # 5.使用 mapValues 算子完成以上需求
    values = rdd.mapValues(lambda x: x * x if x % 2 == 0 else x * x * x)
    # 6.使用rdd.collect() 收集完成 mapValues 转换的元素
    print(values.collect())
    # 7.停止 SparkContext
    sc.stop()
    # ********** End **********#

第9关:Transformations - reduceByKey

100

任务要求
参考答案
评论4

任务描述
相关知识
    reduceByKey
    reduceByKey 案例
编程要求
测试说明

任务描述

本关任务:使用 Spark 的 reduceByKey 算子按照相关需求完成转换操作。
相关知识

为了完成本关任务,你需要掌握:如何使用 reduceByKey 算子。
reduceByKey

reduceByKey 算子,只是两个值合并成一个值,比如叠加。

函数实现:

 def reduceByKey(self, func, numPartitions=None, partitionFunc=portable_hash):
        return self.combineByKey(lambda x: x, func, func, numPartitions, partitionFunc)

上图中的方框代表 RDD 分区。通过自定义函数 (A,B) => (A + B) ,将相同 key 的数据 (V1,2) 和 (V1,1) 的 value 做加法运算,结果为( V1,3)。
reduceByKey 案例

    sc = SparkContext("local", "Simple App")
    data = [("a",1),("a",2),("b",1)]
    rdd = sc.parallelize(data)
    print(rdd.reduceByKey(lambda x,y:x+y).collect())

输出:

[('a', 3), ('b', 1)]

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

需求:使用 reduceByKey 算子,将 rdd(key-value类型) 中的数据进行值累加。

例如:

("soma",4), ("soma",1), ("soma",2) ->  ("soma",7)

测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

开始你的任务吧,祝你成功!

# -*- coding: UTF-8 -*-
from pyspark import SparkContext

if __name__ == "__main__":
    # ********** Begin **********#
    # 1.初始化 SparkContext,该对象是 Spark 程序的入口
    sc = SparkContext("local", "Simple App")
    # 2.创建一个内容为[("python", 1), ("scala", 2), ("python", 3), ("python", 4), ("java", 5)]的列表List
    data = [("python", 1), ("scala", 2), ("python", 3), ("python", 4), ("java", 5)]
    # 3.通过 SparkContext 并行化创建 rdd
    rdd = sc.parallelize(data)
    # 4.使用rdd.collect() 收集 rdd 的元素
    print(rdd.collect())
    """
          使用 reduceByKey 算子,将 rdd 的数据[("python", 1), ("scala", 2), ("python", 3), ("python", 4), ("java", 5)] 按照下面的规则进行转换操作,规则如下:
          需求:
              元素(key-value)的value累加操作,例如:
                                                (1,1),(1,1),(1,2)  --> (1,4)
                                                (1,1),(1,1),(2,2),(2,2)  --> (1,2),(2,4)
    """
    # 5.使用 reduceByKey 算子完成以上需求
    result = rdd.reduceByKey(lambda x, y: x + y)
    # 6.使用rdd.collect() 收集完成 reduceByKey 转换的元素
    print(result.collect())
    # 7.停止 SparkContext
    sc.stop()
    # ********** End **********#

第10关:Actions - 常用算子

100

任务要求
参考答案
评论4

任务描述
相关知识
    count
    first
    take
    reduce
    collect
编程要求
测试说明

任务描述

本关任务:使用Spark 的 Action 常用算子按照相关需求完成相关操作。
相关知识

为了完成本关任务,你需要掌握:如何使用 Action 的常用算子。
count

count():返回 RDD 的元素个数。

示例:

    sc = SparkContext("local", "Simple App")
    data = ["python", "python", "python", "java", "java"]
    rdd = sc.parallelize(data)
    print(rdd.count())

输出:

5

first

first():返回 RDD 的第一个元素(类似于take(1))。

示例:

    sc = SparkContext("local", "Simple App")
    data = ["python", "python", "python", "java", "java"]
    rdd = sc.parallelize(data)
    print(rdd.first())

输出:

python

take

take(n):返回一个由数据集的前 n 个元素组成的数组。

示例:

    sc = SparkContext("local", "Simple App")
    data = ["python", "python", "python", "java", "java"]
    rdd = sc.parallelize(data)
    print(rdd.take(2))

输出:

['python', 'python']

reduce

reduce():通过func函数聚集 RDD 中的所有元素,该函数应该是可交换的和关联的,以便可以并行正确计算。

示例:

    sc = SparkContext("local", "Simple App")
    data = [1,1,1,1]
    rdd = sc.parallelize(data)
    print(rdd.reduce(lambda x,y:x+y))

输出:

4

collect

collect():在驱动程序中,以数组的形式返回数据集的所有元素。

示例:

    sc = SparkContext("local", "Simple App")
    data = [1,1,1,1]
    rdd = sc.parallelize(data)
    print(rdd.collect())

输出:

[1,1,1,1]

编程要求

请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下:

需求1:使用 count 算子,统计下 rdd 中元素的个数;

需求2:使用 first 算子,获取 rdd 首个元素;

需求3:使用 take 算子,获取 rdd 前三个元素;

需求4:使用 reduce 算子,进行累加操作;

需求5:使用 collect 算子,收集所有元素。
测试说明

补充完代码后,点击测评,平台会对你编写的代码进行测试,当你的结果与预期输出一致时,即为通过。

开始你的任务吧,祝你成功!

# -*- coding: UTF-8 -*-
from pyspark import SparkContext

if __name__ == "__main__":
   # ********** Begin **********#
    # 1.初始化 SparkContext,该对象是 Spark 程序的入口
    sc = SparkContext("local", "Simple App")
    # 2.创建一个内容为[1, 3, 5, 7, 9, 8, 6, 4, 2]的列表List
    data = [1, 3, 5, 7, 9, 8, 6, 4, 2]
    # 3.通过 SparkContext 并行化创建 rdd
    rdd = sc.parallelize(data)
    # 4.收集rdd的所有元素并print输出
    print(rdd.collect())
    # 5.统计rdd的元素个数并print输出
    print(rdd.count())
    # 6.获取rdd的第一个元素并print输出
    print(rdd.first())
    # 7.获取rdd的前3个元素并print输出
    print(rdd.take(3))
    # 8.聚合rdd的所有元素并print输出
    print(rdd.reduce(lambda x, y: x + y))
    # 9.停止 SparkContext
    sc.stop()
    # ********** End **********#
  • 12
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值