Spark编程基础(Python版)实验三RDD编程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

一、实验环境

           Ubuntu18.04

           Spark 2.4.0

           Python 3.6.5

二、实验流程

1.PySpark交互式编程

在 spark下创建文件夹sparksqldata,将data01.txt上传到sparksqldata下:

cd /usr/local/spark
mkdir sparksqldata
cd /bin
./pyspark

(1)统计学生人数(即文件的行数)

lines = sc.textFile("file:///usr/local/spark/sparksqldata/Data01.txt")
res = lines.map(lambda x:x.split(",")).map(lambda x: x[0]) //获取每行数据的第1列 
distinct_res = res.distinct()  //去重操作
distinct_res.count()//取元素总个数

(2)统计开设课程总数

lines = sc.textFile("file:///usr/local/spark/sparksqldata/data01.txt")
df = lines.map(lambda x:x.split(",")).map(lambda x:x[1]) 
df1 = df.distinct()
df1.count()
### Spark Python RDD 编程基础教程 #### 1. 创建RDDSpark中,可以通过两种主要方式创建RDD:从集合数据并行化创建以及通过外部存储系统的文件加载。 - **从集合数据并行化创建** 可以使用`sc.parallelize()`函数来将Python列表转换成RDD。例如: ```python list_data = ["Hadoop", "Spark", "Hive"] rdd = sc.parallelize(list_data) print(rdd.collect()) # 行动操作,收集所有元素到驱动程序[^3] ``` - **从外部存储系统加载数据** 可以利用`sc.textFile()`方法读取本地或分布式文件系统中的文件内容作为RDD。例如: ```python lines = sc.textFile("file:///usr/local/spark/sparksqldata/data01.txt") lines.foreach(print) # 遍历打印每一行的内容[^2] ``` --- #### 2. RDD的操作分类 RDD支持两类基本操作:转化操作(Transformation)和行动操作(Action)。 - **转化操作** 转化操作返回一个新的RDD对象,常见的有`map()`、`filter()`等。这些操作不会立即执行,而是采用惰性求值的方式延迟计算直到遇到行动操作为止。 ```python data = [1, 2, 3, 4, 5] rdd1 = sc.parallelize(data) # 使用 map 转换每个元素加 1 rdd2 = rdd1.map(lambda x: x + 1) result = rdd2.collect() # 收集结果以触发实际计算 print(result) # 输出 [2, 3, 4, 5, 6][^4] ``` - **行动操作** 行动操作会触发改RDD的实际计算过程并将结果返回给驱动器或者保存至外部存储系统。典型的行动操作包括`count()`、`collect()`、`foreach()`等。 ```python print(rdd.count()) # 统计RDD中元素的数量 # 将RDD中的所有元素连接为字符串形式输出 print(','.join(rdd.collect())) ``` --- #### 3. 常见的RDD转化操作 以下是几个常用的转化操作及其功能说明: | 方法名 | 描述 | |--------------|--------------------------------------------------------------| | `map(f)` | 对RDD中的每一个元素应用函数f,并返回新的RDD | | `filter(f)` | 过滤掉不满足条件f的元素 | | `flatMap(f)` | 类似于map,但是每个输入项都可以映射为多个输出项 | 示例代码如下所示: ```python words = ['hello', 'world'] rdd_words = sc.parallelize(words) # 使用 flatMap 将单词拆分为字符序列 chars_rdd = rdd_words.flatMap(lambda word: list(word)) print(chars_rdd.collect()) ``` --- #### 4. 数据持久化与性能优化 由于RDD默认情况下是惰性的,在多次迭代过程中可能会反复重新计算相同的数据。为了避免这种冗余开销,可以考虑缓存中间结果。 ```python intermediate_rdd = rdd.filter(lambda line: 'error' in line.lower()).cache() errors_count = intermediate_rdd.count() critical_errors = intermediate_rdd.filter(lambda line: 'critical' in line).count() print(errors_count, critical_errors) # 只需一次物理扫描即可完成两次统计 ``` ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值