PySpark 计算平均值:两种方法详解(RDD 与 Spark SQL)
PySpark 计算平均值:两种方法详解
本文将介绍如何使用 PySpark 计算存储在文本文件 'data01.txt' 中数据的平均值。我们将使用两种方法:
- 使用 RDD
- 使用 Spark SQL
方法一:使用 RDD
from pyspark import SparkContext
sc = SparkContext.getOrCreate()
lines = sc.textFile('data01.txt')
# 将每行数据按逗号分隔,并转换为键值对 (key, (value, 1))
res = lines.map(lambda x: x.split(',')).map(lambda x: (x[1], (int(x[2]), 1)))
# 按 key 聚合,并将 value 和 count 相加
result = res.reduceByKey(lambda x, y: (x[0] + y[0], x[1] + y[1]))
# 计算平均值
avg = result.map(lambda x: (x[0], (x[1][0] / x[1][1])))
# 打印结果
print(avg.collect())
代码解释:
- 首先,我们创建一个
SparkContext对象。 - 然后,我们使用
textFile()方法读取文本文件 'data01.txt'。 - 使用
map()方法将每行数据按逗号分隔,并转换为键值对 (key, (value, 1)),其中 key 为分组依据,value 为数值,1 代表该 key 出现的次数。 - 使用
reduceByKey()方法按 key 聚合数据,并将 value 和 count 相加。 - 使用
map()方法计算每个 key 的平均值。 - 最后,使用
collect()方法收集结果并打印。
方法二:使用 Spark SQL
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
# 读取文本文件为 DataFrame
df = spark.read.text('data01.txt')
# 使用 split 函数分割字符串
df = df.withColumn('split_col', split(col('value'), ','))
# 选择需要的列并转换为适当的数据类型
df = df.select(col('split_col')[1].alias('key'), col('split_col')[2].cast('int').alias('value'))
# 按 key 分组并计算平均值
avg = df.groupBy('key').avg('value')
# 显示结果
avg.show()
代码解释:
- 首先,我们创建一个
SparkSession对象。 - 使用
spark.read.text()方法读取文本文件 'data01.txt' 到 DataFrame 中。 - 使用
split()函数将 'value' 列按逗号分割,并将结果存储在新的 'split_col' 列中。 - 使用
select()方法选择需要的列,并将 'split_col' 中的第二列和第三列分别命名为 'key' 和 'value'。同时将 'value' 列转换为整数类型。 - 使用
groupBy()方法按 'key' 列分组,并使用avg()函数计算 'value' 列的平均值。 - 最后,使用
show()方法展示结果。
总结
本文介绍了两种使用 PySpark 计算平均值的方法。使用 RDD 的方法更接近底层,可以更灵活地控制数据处理过程。使用 Spark SQL 的方法更加简洁易懂,适合处理结构化数据。选择哪种方法取决于具体的需求和数据特点。
原文地址: https://www.cveoy.top/t/topic/kLB 著作权归作者所有。请勿转载和采集!