实现排序功能
(1)按照价格排序
第一种
1 | package com.ruozedata.spark.spark02 |
这里一定要注意:
你运行出来的结果可能顺序不对,sortBy是全局排序的 所以你测试的时候 可以设置分区数为 1
上面的结果当然也可以按多个排:
价格相同,再按照库存的数量排序
1 | package com.ruozedata.spark.spark02 |
上面那种是使用Tuple的方式 ,生产上还是要封装一个类来实现的
第二种
1 | package com.ruozedata.spark.spark02 |
直接报错:
Error:(21, 18) No implicit Ordering defined for com.ruozedata.spark.spark02.Products.
}).sortBy(x=>x).printInfo()
Error:(21, 18) not enough arguments for method sortBy: (implicit ord: Ordering[com.ruozedata.spark.spark02.Products], implicit ctag: scala.reflect.ClassTag[com.ruozedata.spark.spark02.Products])org.apache.spark.rdd.RDD[com.ruozedata.spark.spark02.Products].
Unspecified value parameters ord, ctag.
}).sortBy(x=>x).printInfo()
1 | 按上面那么写有什么问题? |
因为:
Error:(21, 18) not enough arguments for method sortBy: (implicit ord: Ordering[com.ruozedata.spark.spark02.Products], implicit ctag: scala.reflect.ClassTag[com.ruozedata.spark.spark02.Products])org.apache.spark.rdd.RDD[com.ruozedata.spark.spark02.Products].
所以:
1.not enough arguments
2.(implicit ord: Ordering[com.ruozedata.spark.spark02.Products] 一个Products类型
1 | package com.ruozedata.spark.spark02 |
修改之后再看:
又报错了:
Serialization stack:
- object not serializable (class: com.ruozedata.spark.spark02.Products, value: com.ruozedata.spark.spark02.Products@237c4154)
1 | class Products(val name:String , val price:Double,val amount:Int) |
修改之后:
没问题了 那么我想看输出结果 该怎么办呢?
toString 就可以了
1 | class Products(val name:String , val price:Double,val amount:Int) |
1 | package com.ruozedata.spark.spark02 |
工作当中别这么用 毕竟自己实现类 还需要序列化 挺麻烦的
第三种 case class
生产上用的比较多
1 | package com.ruozedata.spark.spark02 |
1 | package com.ruozedata.spark.spark02 |
那么 class 和case class 的区别是什么? 看scala篇
*第四种 使用隐式转换的方式 *
1 | package com.ruozedata.spark.spark02 |
不准对Products03 做任何修改 完成排序功能该怎么办?
Product3默认是不能排序的 ====implicit==> 能排序的
1 | package com.ruozedata.spark.spark02 |
第五种 花里胡哨
能看懂就行 不需要掌握
实际上也是 隐式转换 隐式变量
思路就是 :
(implicit ord: Ordering[com.ruozedata.spark.spark02.Products] 一个Products类型
既然你却这个 就隐式转换给你
1 | package com.ruozedata.spark.spark02 |
1 | package com.ruozedata.spark.spark02 |
1 | 总结: |