Spark-Python基础操作


仅以使用为主,不讲求理解原理
参考:http://www.youkuaiyun.com/article/2015-04-24/2824552

1. 运行方式
1)spark主目录下bin/spark-submit test.py
2)bin/pyspark打开Python交互命令行
2. 初始化
conf=SparkConf().setAppName(appName).setMaster(master)
sc=SparkContext(conf=conf)
指定master并行数量,但是sc已经建立,这样直接运行会报错:(
通过--master可设置参数
./bin/pyspark --master local[4] 启动4线程
具体可参考pyspark -help看其他命令
3.RDD操作
1)集合并行化 
data = [1,2,3,4]
distdata = sc.parallelize(data)
2) 外部数据集
确保启动dfs,上传文件至hdfs
在hadoop目录下运行
hadoop fs -mkdir /usr/hadoop/input
hadoop fs -copyFromLocal /usr/local/test.txt /usr/hadoop/input
hadoop fs -ls /usr/hadoop/input
在pyspark中执行
file = "/usr/hadoop/input/test.txt"
distfile = sc.textFile(file)
3) 转化操作,根据惰性其并不立即执行,需要启动操作,例如:map
linelengths= distfile.map(lambda s:len(s))
4) 启动操作,立即执行,例如:reduce
linelengths.reduce(lambda a,b:a+b)
5)持久化RDD,便于重复使用结果
在reduce之前加入
linelengths.persist()
删除unpersist()
6) 广播变量,每台机器上保持一个只读变量缓存
broadcastVar= sc.broadcast([1,2,3,4])
broadcastVar.value
### Spark算子在Python中的基本用法 #### 什么是Spark算子? Apache Spark 是一种分布式计算框架,支持大规模数据处理。它提供了丰富的操作接口来实现各种数据转换和动作功能。这些操作被称为 **算子 (Operators)** 或者 **Transformation 和 Action**[^1]。 #### 基本概念 - **Transformation**: 转换操作会基于现有的 RDD 创建一个新的 RDD,但不会立即执行。 - **Action**: 动作操作会触发实际的计算过程并返回结果或者将结果保存到外部存储中。 以下是几个常见的 Transformation 和 Action 的例子: --- #### 使用 `map` 进行简单映射 `map` 算子用于对每个元素应用函数,并返回新的 RDD。 ```python from pyspark import SparkContext sc = SparkContext("local", "Map Example") data = ["apple", "banana", "cherry"] rdd = sc.parallelize(data) result_rdd = rdd.map(lambda x: f"{x}_processed") # 对每个字符串附加 "_processed" output = result_rdd.collect() # 收集结果作为列表 print(output) # 输出:['apple_processed', 'banana_processed', 'cherry_processed'] ``` --- #### 使用 `filter` 过滤数据 `filter` 算子可以用来过滤掉不符合条件的数据项。 ```python filtered_rdd = rdd.filter(lambda x: len(x) > 5) # 只保留长度大于5的单词 output_filtered = filtered_rdd.collect() print(output_filtered) # 输出:['banana', 'cherry'] ``` --- #### 使用 `groupByKey` 处理键值对 当需要按 key 组合多个 value 时,可使用 `groupByKey` 算子。此方法适用于 Key-Value 类型的 RDD 数据结构。 ```python kv_data = [("a", 1), ("b", 2), ("a", 3)] kv_rdd = sc.parallelize(kv_data) grouped_rdd = kv_rdd.groupByKey().mapValues(list) # 将相同key对应的value组合成list output_grouped = grouped_rdd.collect() print(output_grouped) # 输出:[('a', [1, 3]), ('b', [2])] ``` 这里需要注意的是,在某些情况下可能更推荐使用 `reduceByKey` 来代替 `groupByKey`,因为后者可能会导致较大的内存占用[^2]。 --- #### 使用 `countByValue` 计数重复值 如果想统计某个集合里各个唯一值的数量,则可以用 `countByValue()` 方法完成这一需求。 ```python repeated_values = ['python', 'python', 'python', 'java', 'java'] values_rdd = sc.parallelize(repeated_values) counts = values_rdd.countByValue() for k, v in counts.items(): print(f"{k}: {v}") # 输出:python: 3\n java: 2 ``` --- #### 结合多种算子构建复杂逻辑 通过链式调用不同类型的算子,能够轻松解决复杂的业务场景问题。 ```python complex_data = [('spark', 2), ('hadoop', 3), ('hive', 4), ('spark', 6)] complex_rdd = sc.parallelize(complex_data) summed_by_key = complex_rdd.reduceByKey(lambda a,b:a+b).sortByKey() final_result = summed_by_key.collect() print(final_result) # 输出:[('hive', 4), ('hadoop', 3), ('spark', 8)] ``` --- ### 总结 上述展示了部分常用的 PySpark 算子及其具体应用场景。每种算子都有其特定用途以及性能特点,合理选用能极大提升程序效率与代码简洁度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值