工厂模式的核心思想就是把创建对象和使用对象解藕,由工厂负责对象的创建,而用户只能通过接口来使用对象,这样就可以灵活应对变化的业务需求,方便代码管理、避免代码重复。
1.工厂设计模式的例子:水果,苹果和橘子#
程序在接口和子类之间加入一个过渡类,通过此过渡类端取得接口的实例化对象,一般都会称这个过渡端为工厂类
1 | interface Fruit{ |
2.将反射应用在工厂模式上#
为了能不修改工厂方法

1 | interface Fruit{ |
3.结合属性文件的工厂模式#
工厂模式的核心思想就是把创建对象和使用对象解藕,由工厂负责对象的创建,而用户只能通过接口来使用对象,这样就可以灵活应对变化的业务需求,方便代码管理、避免代码重复。
程序在接口和子类之间加入一个过渡类,通过此过渡类端取得接口的实例化对象,一般都会称这个过渡端为工厂类
1 | interface Fruit{ |
为了能不修改工厂方法
1 | interface Fruit{ |
适配器设计模式,一个接口首先被一个抽象类先实现(此抽象类通常称为适配器类,比如下面的WindowAdapter),并在此抽象类中实现若干方法(但是这个抽象类中的方法体是空的),则以后的子类直接继承此抽象类,就可以有选择地覆写所需要的方法。
1 | interface Window{ //定义Window接口,表示窗口操作 |
用户可以根据自己的需要定义自己的异常类,定义异常类只需要继承Exception类即可
1 | class MyException extends Exception{ //自定义异常类,继承Exception类 |
1.安装pyenv
1 | brew install pyenv |
2.是否安装成功
1 | pyenv -v |
3.安装python3.8.10,2.7.15和miniconda3-4.7.12
1 | pyenv install 3.8.10 |
查看可以安装的版本列表
1 | pyenv install --list |
4.查看安装的python版本
1 | pyenv versions |
Impala对于hive引擎的语法和hive原生的有些许不同,虽然使用hive的parser也能部分兼容,但是由于impala的parser是使用flex(Fast Lexical Analyzer Generator,快速词法分析生成器)和java cup(Java Constructor of Useful Parsers,生成语法分析器(parser)的工具)开发的,所以对impala的query进行语法解析的时候建议还是使用Impala原生的parser
1.在安装了impala的机器下找到impala-frontend的jar包(环境中的impala版本为2.12.0+cdh5.15.1+0)
1 | lintong@master:/opt/cloudera/parcels/CDH/jars$ ls | grep impala-frontend |
2.使用mvn install安装到本地仓库中,或者上传到私服仓库中
1 | mvn install:install-file -Dfile=/home/lintong/下载/impala-frontend-0.1-SNAPSHOT.jar -DgroupId=org.apache.impala -DartifactId=impala-frontend -Dversion=0.1-SNAPSHOT -Dpackaging=jar |
3.在工程中引入impala-frontend和java-cup,java-cup的版本可以使用反编译工具打开impala-frontend的jar进行确认
1 | <dependency> |
在解析select语句的时候如果报
1 | java.lang.NoClassDefFoundError: org/apache/sentry/core/model/db/DBModelAction |
在pom中添加
多态性在面向对象中主要有两种体现:
向上转型:子类对象–>父类对象,向上转型会自动完成
向下转型:父类对象–>子类对象,向下转型时,必须明确地指明转型的子类类型
虽然使用的父类对象调用fun1方法,但是实际上调用的方法是被子类覆写过的方法,也就是说,如果对象发生了向上转型关系后,所调用的方法一定是被子类覆写过的方法。
但是父类的a无法调用b类中的fun3方法,因为这个方法只在子类中定义,而没有在父类中定义。
1 | class C_1{ // 定义接口C_1 |
在子类中调用了父类中的fun2方法,fun2方法要调用fun1方法,但是此时fun1方法已经被子类覆写过了,所以调用fun2方法的时候还是调用被子类覆写过的方法
在进行对象的向下转型之前,必须首先发生对象的向上转型,否则将出现对象转换异常
1 | class C_1{ // 定义接口C_1 |
operator用于产生特定的DAG节点
1 | https://airflow.apache.org/docs/apache-airflow/stable/python-api-ref.html#operators |
下面是常用的operator及其用法
1 | https://airflow.apache.org/docs/apache-airflow/stable/_modules/airflow/models/baseoperator.html |
用法:
1 | https://airflow.apache.org/docs/apache-airflow/stable/_modules/airflow/sensors/base.html#BaseSensorOperator.poke |
用法:
sensor也是airflow的一种operator,用于检测某个条件是否达到。如果条件满足,sensor将会执行成功;如果条件不满足,sensor将会重试,直到超时,task超时的时候状态就位skipped。
下面是常用的几种sensor:
参考:Airflow Sensors : What you need to know
以及 How Airbnb Built “Wall” to prevent data bugs