PySpark 计算平均值:两种方法详解

本文将介绍如何使用 PySpark 计算存储在文本文件 'data01.txt' 中数据的平均值。我们将使用两种方法:

  1. 使用 RDD
  2. 使用 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())

代码解释:

  1. 首先,我们创建一个 SparkContext 对象。
  2. 然后,我们使用 textFile() 方法读取文本文件 'data01.txt'。
  3. 使用 map() 方法将每行数据按逗号分隔,并转换为键值对 (key, (value, 1)),其中 key 为分组依据,value 为数值,1 代表该 key 出现的次数。
  4. 使用 reduceByKey() 方法按 key 聚合数据,并将 value 和 count 相加。
  5. 使用 map() 方法计算每个 key 的平均值。
  6. 最后,使用 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()

代码解释:

  1. 首先,我们创建一个 SparkSession 对象。
  2. 使用 spark.read.text() 方法读取文本文件 'data01.txt' 到 DataFrame 中。
  3. 使用 split() 函数将 'value' 列按逗号分割,并将结果存储在新的 'split_col' 列中。
  4. 使用 select() 方法选择需要的列,并将 'split_col' 中的第二列和第三列分别命名为 'key' 和 'value'。同时将 'value' 列转换为整数类型。
  5. 使用 groupBy() 方法按 'key' 列分组,并使用 avg() 函数计算 'value' 列的平均值。
  6. 最后,使用 show() 方法展示结果。

总结

本文介绍了两种使用 PySpark 计算平均值的方法。使用 RDD 的方法更接近底层,可以更灵活地控制数据处理过程。使用 Spark SQL 的方法更加简洁易懂,适合处理结构化数据。选择哪种方法取决于具体的需求和数据特点。

PySpark 计算平均值:两种方法详解(RDD 与 Spark SQL)

原文地址: https://www.cveoy.top/t/topic/kLB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录