Spark分组二次排序

2 篇文章 0 订阅
2 篇文章 0 订阅

在运用Spark数据处理中,有时要对数据进行分组(二次)排序。数据存储在HDFS中。实现代码如下:

package com.ibeifeng.spark.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

import scala.collection.mutable.ArrayBuffer
import scala.util.{Random, Try}

object TopN {
  def main(args: Array[String]): Unit = {
    val hdfs = "hdfs://192.168.1.102:8020"
    //设置配置属性
    val conf = SparkConf()
        .setMaster("dataNode1")
        .setAppName("Secnodary-Sort")
        .set("mapreduce.framework.name", "yarn")
        .set("spark.rdd.compress", "true")
        .set("spark.serializer","org.apache.spark.serializer.KryoSerializer")
        .set("spark.storage.memoryFraction", "0.5")
        .set("spark.akka.frameSize", "100")
        .set("spark.default.parallelism", "1")
    val sc = SparkContext.getOrCreate(conf)
    //利用textFile方法创建RDD
     val fileRDD: RDD[String] = sc.textFile(s"hdfs://${hdfs}/Data/emp.data")
     val wordRDD: RDD[(String, Int)] = fileRDD.map(line => {
        val arr = line.split(" ")

   //排除数据异常和空格
        (Try(arr(0).trim),Try(1).trim.toInt)
     })
        .groupByKey()
        .sortByKey(true)
        .map(x => (x._1,x._2.sortWith(_ > _)))

  //结果数据输出到HDFS
    wordRDD.saveAsTextFile(s"${hdfs}/interviewData/resultData")
  
groupByKey属于宽依赖RDD,会产生shuffle操作;Spark的shuffle过程,就是将各个节点上相同key的数据拉取到某个节点的一个
task进行处理的过程。如果rdd中某些key对于数据量特别大,就会造成数据倾斜,处理性能将收到影响。处理数据倾斜的方法很多,下次介绍解决方案之一:两阶段聚合



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值