Spark操作——转换操作(三)

本文详细介绍了Spark中的键值转换操作,包括partitionBy、mapValues、flatMapValues、combineByKey、foldByKey和reduceByKey等,阐述了它们的功能、参数含义及应用场景,帮助理解Spark数据处理的核心机制。
摘要由CSDN通过智能技术生成
  • 基础转换操作

  • 键值转换操作

 

键值转换操作

  • partitionBy(partitioner: Partitioner):RDD[(K,V)]

将原来的RDD根据给定的Partitioner函数进行重新分区。

scala> val rdd = sc.makeRDD(Array((1,"A"),(2,"B"),(3,"C"),(4,"D")), 2)
rdd: org.apache.spark.rdd.RDD[(Int, String)] = ParallelCollectionRDD[0] at makeRDD at <console>:24

# 查看每个分区的元素
scala> rdd.mapPartitionsWithIndex{
     |     (partIdx, iter) => {
     |         var part_map = scala.collection.mutable.Map[String, List[(Int,String)]]()
     |         while(iter.hasNext){
     |             var part_name = "part_" + partIdx;
     |             var elem = iter.next()
     |             if(part_map.contains(part_name)) {
     |                 var elems = part_map(part_name)
     |                 elems ::= elem
     |                 part_map(part_name) = elems
     |             }
     |             else{
     |                 part_map(part_name) = List[(Int,String)]{elem}
     |             }
     |         }
     |         part_map.iterator
     |     }
     | }.collect
res5: Array[(String, List[(Int, String)])] = Array((part_0,List((2,B), (1,A))), (part_1,List((4,D), (3,C))))

# 使用partitionBy重新分区
scala> var rddNew = rdd.partitionBy(new org.apache.spark.HashPartitioner(2))
rddNew: org.apache.spark.rdd.RDD[(Int, String)] = ShuffledRDD[2] at partitionBy at <console>:25

# 查看新的分区元素
scala> rddNew.mapPartitionsWithIndex{
     |     (partIdx, iter) => {
     |         var part_map = scala.collection.mutable.Map[String, List[(Int,String)]]()
     |         while(iter.hasNext){
     |             var part_name = "part_" + partIdx;
     |             var elem = iter.next()
     |             if(part_map.contains(part_name)) {
     |            
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
影评案例是一个很好的Spark练习案例,可以帮助你熟悉Spark的基本操作和数据处理。下面我为你提供一个简单的影评案例,希望能帮助到你。 1. 数据准备 我们需要一份电影评分数据集,可以从MovieLens网站上下载到,这里我们使用ml-latest-small数据集,该数据集包含了用户对电影的评分、电影信息和用户信息等数据。 2. 数据处理 我们需要将数据导入到Spark中,并进行数据预处理。首先,我们需要将数据转换成DataFrame类型,然后对数据进行清洗和整理,例如去掉重复数据、缺失数据处理等。 以下是一个简单的处理代码: ``` from pyspark.sql.functions import col # 读取数据 ratings = spark.read.csv("ratings.csv", header=True, inferSchema=True) # 去重 ratings = ratings.dropDuplicates() # 处理缺失值 ratings = ratings.dropna() # 转换数据类型 ratings = ratings.withColumn("userId", col("userId").cast("int")) ratings = ratings.withColumn("movieId", col("movieId").cast("int")) ratings = ratings.withColumn("rating", col("rating").cast("double")) # 查看数据 ratings.show() ``` 3. 数据分析 我们可以使用Spark进行各种数据分析操作,例如对电影评分进行统计,找出评分最高的电影,计算每个用户的平均评分等。 以下是一个简单的分析代码: ``` from pyspark.sql.functions import desc, avg # 统计每个电影的评分数量和平均评分 movie_ratings = ratings.groupBy("movieId").agg({"rating": "count", "rating": "avg"}) movie_ratings = movie_ratings.withColumnRenamed("count(rating)", "num_ratings").withColumnRenamed("avg(rating)", "avg_rating") # 找出评分最高的电影 top_movies = movie_ratings.orderBy(desc("avg_rating")).limit(10) # 计算每个用户的平均评分 user_ratings = ratings.groupBy("userId").agg(avg("rating")) # 查看结果 top_movies.show() user_ratings.show() ``` 4. 结果展示 最后,我们可以将结果保存到文件或数据库中,或者使用可视化工具展示结果。 以上是一个简单的Spark影评案例,希望能够帮助到你。如果你想深入学习Spark,可以尝试更复杂的案例和练习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值