大数据入门第二十二天——spark(三)自定义分区、排序与查找
一、自定义分区
1.概述
默认的是Hash的分区策略,这点和Hadoop是类似的,具体的分区介绍,参见:https://blog.csdn.net/high2011/article/details/68491115
2.实现
package cn.itcast.spark.day3 import java.net.URL
import org.apache.spark.{HashPartitioner, Partitioner, SparkConf, SparkContext}
import scala.collection.mutable /**
* Created by root on 2016/5/18.
*/
object UrlCountPartition { def main(args: Array[String]) { val conf = new SparkConf().setAppName("UrlCountPartition").setMaster("local[2]")
val sc = new SparkContext(conf) //rdd1将数据切分,元组中放的是(URL, 1)
val rdd1 = sc.textFile("c://itcast.log").map(line => {
val f = line.split("\t")
(f(1), 1)
})
val rdd2 = rdd1.reduceByKey(_ + _) val rdd3 = rdd2.map(t => {
val url = t._1
val host = new URL(url).getHost
(host, (url, t._2))
})
val ints = rdd3.map(_._1).distinct().collect()
val hostParitioner = new HostParitioner(ints)
// val rdd4 = rdd3.partitionBy(new HashPartitioner(ints.length)) val rdd4 = rdd3.partitionBy(hostParitioner).mapPartitions(it => {
it.toList.sortBy(_._2._2).reverse.take(2).iterator
})
rdd4.saveAsTextFile("c://out4")
//println(rdd4.collect().toBuffer)
sc.stop()
}
} /**
* 决定了数据到哪个分区里面
* @param ins
*/
class HostParitioner(ins: Array[String]) extends Partitioner { val parMap = new mutable.HashMap[String, Int]()
var count = 0
for(i <- ins){
parMap += (i -> count)
count += 1
} override def numPartitions: Int = ins.length override def getPartition(key: Any): Int = {
parMap.getOrElse(key.toString, 0)
}
}
// 与Hadoop相通,不再赘述
二、自定义排序
基本上就是结合之前的隐式转换了:(这里使用样例类可以不用new就能得到实例,另外也可以用于模式匹配)
package cn.itcast.spark.day3
import org.apache.spark.{SparkConf, SparkContext}
object OrderContext {
implicit val girlOrdering = new Ordering[Girl] {
override def compare(x: Girl, y: Girl): Int = {
if(x.faceValue > y.faceValue) 1
else if (x.faceValue == y.faceValue) {
if(x.age > y.age) -1 else 1
} else -1
}
}
}
/**
* Created by root on 2016/5/18.
*/
//sort =>规则 先按faveValue,比较年龄
//name,faveValue,age
object CustomSort {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("CustomSort").setMaster("local[2]")
val sc = new SparkContext(conf)
val rdd1 = sc.parallelize(List(("yuihatano", 90, 28, 1), ("angelababy", 90, 27, 2),("JuJingYi", 95, 22, 3)))
import OrderContext._
val rdd2 = rdd1.sortBy(x => Girl(x._2, x._3), false)
println(rdd2.collect().toBuffer)
sc.stop()
}
}
/**
* 第一种方式
* @param faceValue
* @param age
case class Girl(val faceValue: Int, val age: Int) extends Ordered[Girl] with Serializable {
override def compare(that: Girl): Int = {
if(this.faceValue == that.faceValue) {
that.age - this.age
} else {
this.faceValue -that.faceValue
}
}
}
*/
/**
* 第二种,通过隐式转换完成排序
* @param faceValue
* @param age
*/
case class Girl(faceValue: Int, age: Int) extends Serializable
// 复习隐式转换,基本也无新内容
三、IP查找小练习
参考:https://www.cnblogs.com/wnbahmbb/p/6250099.html
大数据入门第二十二天——spark(三)自定义分区、排序与查找的更多相关文章
- 大数据入门第二十二天——spark(一)入门与安装
一.概述 1.什么是spark 从官网http://spark.apache.org/可以得知: Apache Spark™ is a fast and general engine for larg ...
- 大数据入门第二十二天——spark(二)RDD算子(1)
一.RDD概述 1.什么是RDD RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行计算的 ...
- 大数据入门第二十二天——spark(二)RDD算子(2)与spark其它特性
一.JdbcRDD与关系型数据库交互 虽然略显鸡肋,但这里还是记录一下(点开JdbcRDD可以看到限制比较死,基本是鸡肋.但好在我们可以通过自定义的JdbcRDD来帮助我们完成与关系型数据库的交互.这 ...
- 大数据入门第二十五天——elasticsearch入门
一.概述 推荐路神的ES权威指南翻译:https://es.xiaoleilu.com/010_Intro/00_README.html 官网:https://www.elastic.co/cn/pr ...
- 大数据入门第二十三天——SparkSQL(二)结合hive
一.SparkSQL结合hive 1.首先通过官网查看与hive匹配的版本 这里可以看到是1.2.1 2.与hive结合 spark可以通过读取hive的元数据来兼容hive,读取hive的表数据,然 ...
- 大数据入门第二十五天——logstash入门
一.概述 1.logstash是什么 根据官网介绍: Logstash 是开源的服务器端数据处理管道,能够同时 从多个来源采集数据.转换数据,然后将数据发送到您最喜欢的 “存储库” 中.(我们的存储库 ...
- 大数据入门第二十四天——SparkStreaming(一)入门与示例
一.概述 1.什么是spark streaming Spark Streaming is an extension of the core Spark API that enables scalabl ...
- 大数据入门第二十三天——SparkSQL(一)入门与使用
一.概述 1.什么是sparkSQL 根据官网的解释: Spark SQL is a Spark module for structured data processing. 也就是说,sparkSQ ...
- 大数据入门第二天——基础部分之zookeeper(下)
一.集群自启动脚本 1.关闭zk [root@localhost bin]# jps Jps QuorumPeerMain [root@localhost bin]# //kill或者stop都是可以 ...
随机推荐
- 敏捷开发的道与术---MPD软件工作坊培训感想(上)
注:由麦思博(MSUP)主办的2013年亚太软件研发团队管理峰会(以下简称MPD大会)分别于6月15及6月22日在北京.上海举办,葡萄城的部分程序员参加了上海的会议,本文是参会的一些感受和心得. 这次 ...
- Navicat Premium 12连接Oracle时提示oracle library is not loaded的问题解决
Navicat Premium 12连接Oracle时提示oracle library is not loaded的问题解决 链接时遇到的问题,记录一下 如果还没有安装工具,请参考:Navicat P ...
- ie8 透明背景不能点击问题
最近开发网站,需求是三个一屏,1和3只能看见一半,2显示在中间,无箭头按钮. 因为之前写过一个有前后按钮的插件,想着怎么就在这上面改造,故把前后按钮去掉背景,定位在了1和3的位置上来实现点击前后, 发 ...
- go语言练习:结构体
package main import "fmt" type book struct { title string author string page int } func ma ...
- Mongodb集群与分片 1
分片集群 Mongodb中数据分片叫做chunk,它是一个Collection中的一个连续的数据记录,但是它有一个大小限制,不可以超过200M,如果超出产生新的分片. 下面是一个简单的分片集群 ...
- 单例模式实现 Volitile , interlocked
//单例模式: //1. 双检锁机制 Volatile.write() //2. 静态变量 //3. Interlocked.CompareExchange(ref single, temp, nul ...
- innodb_fast_shutdown的内幕
Innodb_fast_shutdown告诉innodb在它关闭的时候该做什么工作.有三个值可以选择:1. 0表示在innodb关闭的时候,需要purge all, merge insert buf ...
- 3.1Python的判断选择语句
返回总目录 目录: 1.if单分支语句 2.if else 双分支语句 3.if elif ...else多分支语句 4.if 嵌套语句 判断语句总览: (一)if单分支语句: 语法: if 条件: ...
- Redis-安装时问题整理
一.Redis编译: 1.问题:make gcc error yum –y install gcc 2.问题:安装报错 error: jemalloc/jemalloc.h: No such file ...
- linux命令2—常见linux命令
1.进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于 ...