实践和感悟 - scala向下转型和减少穷举
工作中的问题总结:
问题一:scala 之向下转型
引言:假如在复杂的业务逻辑中,变量的类型不能确认,只能给个接口类型,这样数据类型推导不会错误,但是后面要使用实现类的类型时,你却发现转不过来了?
对于这样的一个问题,scala可以这样解决:
首先建造一个接口,People:
trait People {
def toData[T](people:People):T
}
这样定义了一个接口,接着我们实现他的实现类Students和Teacher:
class Students(name: String) extends People {
var level:String="语文" override def toData[Students](people: People): Students = {
people.asInstanceOf[Students]
} def work() {
println("学习")
}
}
object Students {
def apply(name: String): Students = {
new Students(name)
}
}
class Teacher(name: String, age: Int) extends People { var work: String = "hello"
override def toData[Teacher](people: People): Teacher = {
people.asInstanceOf[Teacher]
} def teach() {
println("teaching")
}
}
object Teacher {
def apply(name: String, age: Int): Teacher = {
new Teacher(name, age)
}
}
这样我们的前奏做完了,接下来就测试向下转型:
object Test {
def main(args: Array[String]): Unit = {
val a = ("tom", "")
val b = ("jim")
val people:People = test(a) if (people != null) {
val peo:Teacher=people.toData[Teacher](people)
println(peo.work)
peo.teach()
} val peo:People = test(b) if (peo != null) {
val p:Students=peo.toData[Students](peo)
println(p.level)
p.work()
} } def test(x: Any): People = {
val people = x match {
case (name, age) => Teacher(name.toString(), age.toString().toInt)
case (name) => Students(name.toString())
case _ => null
}
people
}
}
执行结果
hello
teaching
语文
学习
成功转型,这个解决方法是很有用的,工厂生产有很多模型,数据不一样,类型就不一样,但是数据源不确定,所以我们就需要一接口类型,去实现这个接口的子类做为相近数据的类型,这样自动获取对应的数据,是不是很方便、很好用。
问题二:spark Streaming连接kafka
引言:在工作中遇到streaming连接kafka时报错,说找不到topic的末偏移量?
我首先看了看是不是话题没有创建好,用命令接收数据,能收到,说明集群没问题。再测,还是偏移量的问题,这我就犯愁,连接我自己的环境,没问题,这就更蒙了,
第二次尝试:看API,源码手动设置偏移量,尝试一圈之后,问题依然没有解决。
第三次尝试:重新搭环境,结果还是不行
最后,思考我的环境和生产环境的唯一区别就是hosts文件,我将本地的hosts文件配的和生产环境一样,好了。(困扰我两天的问题啊)
总结,应用程序中最好不要填写IP,写映射(而映射和环境必须一致),这个streamingkafkaUtil的类有关。
问题三:生产中减少穷举
引言:在生产环境下面对纷繁的业务处理场景,我们知道要处理很多逻辑代码,其中有个叫枚举(也称穷举),当处理这类事务时,会产生大量的循环执行,而循环是最耗CPU的,大量的迭代计算,可直接拉低计算速度,怎么处理这类问题呢?
对于事务的不定项的选择几率,都会有一定的规律,比如说事件的概率发生,根据概率论的知识,我们可以去统计穷举各项的频率,按其大小依次排列,这样前面的枚举项就可消费大部分数据,剩下的低概率枚举项就会以最小的执行次数执行。
比如说有1000000条数据,枚举项有50个,假如平均25次能找到匹配项,就需要运行25000000次(2.5*10的7次方)
换种思路:假如第一枚举项是是30%,2是25%,3是20%这样前三项就消费750000*3+250000*25=8500000(8.5*10的6次方)
直接降一个数量级的执行次数,当然这些都是假设,是不太准的
但是思路就一样,就是将发生概率高的事件统计优先处理,这既符合生活规律,又符合事务发展的客观规律。
应用场景就太多了,例子:
例子一:话说网络运营商想分析用户的上网行为分析。他不会将网络上的各种资源都先收集一份,然后再去匹配每个用户的某时的上网行为
那样做机器也会累的。所以先样本调查,然后分析大部分的用户行为特征,根据样本获取统计资源,然后这样以最小的资源消费最大的数据,剩下的小概率事件。
例子二:百度搜索词条的建立,也会寻找样本,统计大概率数据精准处理,作为频繁搜索词缓存,让搜索快速而精准,当然那其他的陌生词条利用机器学再处理。每天计算词条的权重,这样以权重排列,这样就会让大概率更加大概率,再次节约速度。
总而言之,事务的发展规律都是一样的,总会有大概率事件,事物的发展规律都是一样的。符合二八定律。用做小的资源去解决大量数据。
实践和感悟 - scala向下转型和减少穷举的更多相关文章
- Java入门记(二):向上转型与向下转型
在对Java学习的过程中,对于转型这种操作比较迷茫,特总结出了此文.例子参考了<Java编程思想>. 目录 几个同义词 向上转型与向下转型 例一:向上转型,调用指定的父类方法 例二:向上转 ...
- java 向上转型 向下转型
//父类 四边形 class Quadrangle{ public static void draw (Quadrangle q){ } } //子类 public class Parallelog ...
- Java向上转型与向下转型
一.向上转型 例如:Parent p=new Son(); 这样引用p只能调用子类中重载父类的方法:但属性是父类的:如果想调用子类属性的话,可以用getter()方法. 二.向下转型 子类对象的父类引 ...
- (转载)java多态(2)-------Java转型(向上或向下转型)
5.13.1 向上转型 我们在现实中常常这样说:这个人会唱歌.在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”.再例如,麻雀是鸟类的一种(鸟类的子类), ...
- Java中的向上转型和向下转型
首先要明白一点向上转型和向下转型他们都是建立在继承的基础上. 一.向上转型 子类到父类的转换通常称作向上转型,通俗的说就是定义父类对象指向子类对象. 下面通过一个例子来深入理解向上转型. //定义一个 ...
- 集合 ArrayList 向下转型 遍历
List list=new ArrayList(); Person p1=new Person("lisi1",21); Person p2=new Person("l ...
- java基础值向上向下转型
1.父类引用可以指向子类对象,子类引用不能指向父类对象. 2.向上转型:子类引用的对象转换为父类类型称为向上转型,把子类对象直接赋给父类引用叫upcasting,向上转型不用强制转型(类似于低精度赋给 ...
- Java转型(向上转型和向下转型)
在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型. 5.13.1 向上转型 我们在现实中常常这样说:这个人会唱歌.在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就 ...
- java上转型和下转型(对象的多态性)
/*上转型和下转型(对象的多态性) *上转型:是子类对象由父类引用,格式:parent p=new son *也就是说,想要上转型的前提必须是有继承关系的两个类. *在调用方法的时候,上转型对象只能调 ...
随机推荐
- vue2.x中请求之前数据显示以及vuex缓存的问题
在项目中遇到两个问题,简单的做个笔记来记录自己解决的问题,可能不是很好的处理办法,欢迎提出,自己还在不断优化中... 第一个是vue在加载页面的时候,会先加载静态资源,这个时候数据还没有请求回来,用户 ...
- C#在.NET编译执行过程
1..NET语言的编译器接受源代码文件,并生成名为程序集的输出文件. 程序集要么是可执行的,要么是DLL 程序集里的代码并不是本机代码,而是一种名称为CIL的中间语言 程序集包含如下信息: 程序的CI ...
- C# byte 和 char 转化
C# byte 和 char 可以认为是等价的.但是在文本显示的时候有差异. c# 使用的是unicode字符集,应该和为ascii相互转换 只能转换到字符的unicode编码,或者由unico ...
- 如何在HTML 5中拖动光标图标?
window.app = { dragging: false, config: { canDrag: false, cursorOffsetX: null, cursorOffsetY: null } ...
- Ubuntu16.04 LTS上安装Go1.10
原因 Ubuntu资源库上默认使用的是Go1.6.2版本,给最新版本代码编译带来了不少问题.本文就记录下在Ubuntu下直接安装Go最新版1.10的步骤. 准备工作 1.卸载已有版本 # 卸载已经安装 ...
- 解决:maven 项目添加 pom 的 oracle 依赖
前言:maven 项目需要在 pom 文件中添加 oracle 的依赖. 如果报错:报找不到驱动:java.lang.ClassNotFoundException: oracle.jdbc.drive ...
- K:红黑树
红黑树由AVL树改进而来,红黑树与AVL都是平衡结构的树.对于AVL树,其每次插入操作都需要从根节点处开始判断该树是否失去平衡,从而做出相应的调整.且其调整过程较为麻烦,每次都需要判断其左右两棵子 ...
- 一个支持DbFirst、ModelFirst和CodeFirst的数据库小工具DbTool
DbTool 一个支持DbFirst.ModelFirst和CodeFirst的数据库工具. 简介 这是一个针对 SqlServer 数据库和 C# 开发语言的小工具,可以利用这个小工具生成数据库表对 ...
- DDD Quickly - 读书笔记
读后感:关于领域驱动设计,过去多多少少用到一些.所以,这本精简版看起来很快,很多概念很熟悉,它帮助我把散乱的知识串起来.最后,Eric Evans谈到一点,本来软件的发展是向着处理复杂的业务逻辑走的, ...
- 简洁php的MVC框架
一.文件结构 建立3个文件夹 controller文件夹存放控制器文件 view文件夹存放视图文件 model文件夹存放数据文件 建立1个index.php 作为唯一入口 二.控制器 我们在contr ...