spark中返回结果的误用——Array,Set,HashSet

作者在写Spark代码进行数据过滤时速度慢,经分析是因用collect返回的Array集合的contains方法进行过滤所致。作者还做了Scala性能统计小实验,发现10万次比较下各集合判断性能差异大,提醒使用Spark时需注意。

今天在写spark代码时,遇到一个问题,在进行数据过滤时,总是特别的慢,后来分析了一下代码。
主业务逻辑就是用一个较小的文本数据过滤“大数据”,然后我用spark textFile进行加载然后collect形成一个集合,可能是java写多了,看到这个集合有contains方法,就使用了没有多想,然后就特别慢,排查代码发现,collect返回的是Array(scala中Array也有contains方法,这个被我忽略了),所以不用想导致很慢。下面是我做的是一个scala的性能统计的小实验,贴出来仅供参考。

val array = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val set = Set(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    val hashSet = HashSet(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

    val t1 = System.currentTimeMillis()
    for (i <- 0 to 100000) array.contains(5)
    val t2 = System.currentTimeMillis()
    for (i <- 0 to 100000) set.contains(5)
    val t3 = System.currentTimeMillis()
    for (i <- 0 to 100000) hashSet.contains(5)
    val t31 = System.currentTimeMillis()
    println("Hit the target ---> Array time:" + (t2 - t1) + ", Set time : " + (t3 - t2)
      + ", HashSet time : " + (t31 - t3))

    val t4 = System.currentTimeMillis()
    for (i <- 0 to 100000) array.contains(11)
    val t5 = System.currentTimeMillis()
    for (6 <- 0 to 100000) set.contains(11)
    val t6 = System.currentTimeMillis()
    for (i <- 0 to 100000) hashSet.contains(5)
    val t61 = System.currentTimeMillis()
    println("NOT Hit the target ---> Array time:" + (t5 - t4) + ", Set time : " + (t6 -
      t5)+ ", HashSet time : " + (t61 - t6))
  }

结果如下:

Hit the target ---> Array time:32, Set time : 14, HashSet time : 7
NOT Hit the target ---> Array time:14, Set time : 6, HashSet time : 5

看到在10万次的比较下,各个集合的判断性能还是差别巨大,下次在用spark的时候要特别注意了!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值