zoukankan      html  css  js  c++  java
  • spark: 二次排序-1

    之前文章有写过,使用mapreduce实现二次排序
    在这里使用spark实现二次排序

    1, 思路

    输入数据
    aa 12
    bb 32
    aa 3,
    cc 43
    dd 23
    cc 5
    cc 8
    bb 23
    bb 12

    这里尝试一种想当然的错误思路

    1. 把每一行数据map成二元组(key, value)
    2. 数据继续map成复合二元组(key, value) =>(key%$#value, (key, value))
    3. 按复合key进行字典排序 -- 数字也会被当作字符看待,导致排序结果错误
      比如 aa%$#12的字典顺序小于 aa%$#3
    4. 重构排序后的结果,(key_value, (key, value)) => (key, value)

    2, 实现

    作为测试,数据存放在本地/home/hadoop/second_sort

    val inputFile = sc.textFile("/home/hadoop/second_sort")
    
    //  1. 把每一行数据map成二元组(key, value)
    val splitRdd = inputFile.map{x=>val y = x.split(' '); (y(0), Integer.valueOf(y(1)))}
    
    // 2. 数据继续map成复合二元组(key, value) =>(key%$#value, (key, value))
    val combinedRdd = splitRdd.map(x=>(x._1+"%$#"+x._2, x))
    
    // 3. 按复合key进行字典排序
    val sortedRdd = combinedRdd.sortBy(x=>x)
    
    // 4. 重构排序后的结果,(key_value, (key, value)) => (key, value)
    val resultRdd = sortedRdd.map(x=>(x._2._1, x._2._2))
    

    3 后记

    这种方法存在2个问题:
    1, 上面讲过的,按照复合key的字典排序结果并非我们所期望
    2, 复合key的做法,使rdd的dize增加了1倍

    后面使用自定义排序来实现二次排序,能够解决以上的2个严重问题

  • 相关阅读:
    KMP算法的理解和代码实现
    关于线程死锁
    PAT1018
    PAT1059
    PAT1009
    PAT1006
    PAT1005
    PAT1004
    PAT1002
    PAT
  • 原文地址:https://www.cnblogs.com/ivanny/p/spark_secondary_sort_1.html
Copyright © 2011-2022 走看看