RDD编程--文件排序

案例要求

假设某个目录下有多个文本文件,每个文件中的每一行内容均为一个整数。要求读取所有文件中的整数,进行排序后,输出到一个新文件中,输出的内容为每行两个整数,第一个整数为第二个整数的排序位次,第二个整数为原待排序的整数。

代码
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
import org.apache.spark.HashPartitioner
object FileSort {
    def main(args: Array[String]) {
        val conf = new SparkConf().setAppName("FileSort")
        val sc = new SparkContext(conf)
        val dataFile = "file:///home/hadoop/data"
        val lines = sc.textFile(dataFile, 3)
        val index = 0
        val result = lines.filter(_.trim().length>0).map(n=>(n.trim.toInt, "")).partitionBy(new HashPartitioner(1)).sortByKey().map(t => {
            index += 1
            (index, t._1)
        })
        result.saveAsTextFile("file:///home/hadoop/result")
        sc.stop()
    }
}
代码解释

在读入文件时设置分区数,分区的作用:

可以增加并行度,lines的3个分区分布在不同的工作节点WorkerNode1、WorkerNode2、WorkerNode3上,这3个工作节点可以分别启动1个线程来对这3个分区的数据进行并行处理,增加任务的并行度,提高执行效率。

在排序时使用new HashPartitioner(1)将各分区处理结果合并到一个分区中,再继续后续的键排序。

参考:林子雨 《spark编程基础》

### Python RDD 编程使用指南 在 Apache Spark 中,RDD(弹性分布式数据集)是核心抽象之一。通过 Python API (PySpark),开发者可以轻松创建和操作 RDD 数据结构。以下是关于如何使用 Python 进行 RDD 编程的具体说明以及示例。 #### 创建 RDD 可以通过两种方式创建 RDD:从集合中创建或从外部存储加载数据。 ```python from pyspark import SparkContext sc = SparkContext("local", "Python RDD Example") # 方法一:从集合创建 RDD data_list = [1, 2, 3, 4, 5] rdd_from_list = sc.parallelize(data_list) # 方法二:从外部文件创建 RDD file_path = "/path/to/file.txt" rdd_from_file = sc.textFile(file_path) ``` 以上代码展示了如何分别从列表和文件中创建 RDD[^1]。 #### 常见转换操作 RDD 提供了许多内置的转换操作来处理数据。这些操作不会立即执行,而是采用惰性求值的方式延迟计算直到触发动作操作为止。 - **map**: 对每个元素应用函数并将返回的结果作为新的 RDD。 ```python mapped_rdd = rdd_from_list.map(lambda x: x * 2) print(mapped_rdd.collect()) # 输出结果为 [2, 4, 6, 8, 10] ``` - **filter**: 返回一个新的 RDD,其中只包含满足条件的数据项。 ```python filtered_rdd = rdd_from_list.filter(lambda x: x % 2 == 0) print(filtered_rdd.collect()) # 输出结果为 [2, 4] ``` - **flatMap**: 类似于 map,但是会将结果展平成多个值而不是单一值。 ```python flat_mapped_rdd = sc.parallelize(["hello world"]).flatMap(lambda line: line.split(" ")) print(flat_mapped_rdd.collect()) # 输出结果为 ['hello', 'world'] ``` #### 动作操作 动作操作用于触发改写后的实际计算过程,并通常返回非 RDD 结果或者将数据保存至外部存储系统。 - **collect**: 将整个 RDD 转换成数组形式并收集到驱动程序端。 ```python collected_data = mapped_rdd.collect() print(collected_data) # 输出结果为 [2, 4, 6, 8, 10] ``` - **count**: 统计 RDD 中元素的数量。 ```python total_count = filtered_rdd.count() print(total_count) # 输出结果为 2 ``` - **saveAsTextFile**: 把 RDD 存储为文本文件。 ```python filtered_rdd.saveAsTextFile("/output/path/") ``` #### 排序操作 如果需要对 RDD 的内容进行排序,则可利用 `sortBy` 函数实现升序或降序排列。 ```python sorted_descending = sc.parallelize([5, 3, 8, 6]).sortBy(lambda x: x, ascending=False).collect() print(sorted_descending) # 输出结果为 [8, 6, 5, 3] ``` 上述例子演示了按数值大小做降序排序的过程[^5]。 #### 关键概念——闭包 当定义匿名 lambda 表达式或其他局部变量时需要注意的是,在某些情况下可能涉及到闭包的概念。这意味着如果要在一个节点上的某个分区上调用的方法依赖于其他地方声明好的全局状态或者其他对象成员属性的话,那么这个上下文环境也需要被序列化传输过去以便远程执行器能够正常工作[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值