开发者学堂课程【NoSQL 数据库 Kudu 教程: Kudu 整合 impala-java 操作】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/723/detail/12912
Kudu 整合 impala-java 操作
内容介绍:
一、impala 使用 java 操作 kudu
二、引入依赖
三、具体操作
一、impala 使用 java 操作 kudu
对于 impala 而言,开发人员是可以通过 JDBC 连接 impala 的,有了 JDBC,开发人员可以通过 impala 来间接操作kudu。
使用 impala 使用 JAVA 操作 KUDU,这种情况下和通过 JDBC 操作 mysql 非常类似,只不过需要注意的是 lmpala 的JDBC 驱动是由官网提供,所以要去官网下载驱动包,放到私库或者本地当中。
二、引入依赖
<!--impala
的 jdbc 操作-->
<dependency>
<groupld>com.cloudera</groupld>
<artifactld>lmpalaJDBC41</artifactld>
<version>2.5.42</version>
</dependency>
<!--Caused by : ClassNotFound : thrift.protocol.TPro-->
<dependency>
<groupld>org.apache.thrift</groupld>
<artifactld>libfb303</artifactld>
<version>0.9.3</version>
<type>pom</type>
</dependency>
<!--Caused by : ClassNotFound : thrift.protocol.TPro-->
<dependency>
<groupld>org.apache.thrift</groupld>
<artifactld>libthrift</artifactld>
<version>0.9.3</version>
<type>pom</type>
</dependency>
<dependency
<groupld>org.apache.hive</groupld>
<artifactld>hive-jdbc</artifactld>
<exclusions>
<exclusion>
<groupld>org.apache.hive</groupld>
<artifactld>hive-service-rpc</artifactld>
</exclusion>
<exclusion>
<groupld>org.apache.hive</groupld>
<artifactld>hive-service</artifactld>
</exclusion>
</exclusions>
<version>1.1.0</version>
</dependency>
<!--
导入 hive-->
<dependency>
<groupld>org.apache.hive</groupld>
<artifactld>hive-service</artifactld>
<version>1.1.0</version>
</dependency>
以上是 pom 文件的引用,最后发现驱动包是 lmpalaJDBC41,可以去官网进行下载。在软件的下方,有一个选择impala,里面提供一个 zip,这个就是官网下载下来的,里面有相关的软件应用,这时候打开编译器创建一个 JAVA 工程,或者放在本地的字符当中,大概有以下几个包开发使用。
核心就是刚才所看到的进行客户端连接的 impalaJDBC41.jar,其他都是依赖,创建好以后,单击右键选择Add as library 就可以保证来使用了。
接下来看一下相关代码的编写,整体来看和之前的 impala 没有任何区别,只不过建表的时候需要特别指定表的属性信息存于 kudu上,通过一连串的操作对表进行,增参改参删参体现通过 JAVA API 如何操作 KUDU。
三、具体操作
public Person(int companyId
,int workId,String name,String gender,String photo){
this.companyId = companyId;
this.workId = workId;
this.name = name;
this.gender = gender;
this.photo = photo;
}
public int getcompanyId() i return companyId; }
public void setCompanyId(int companyId) { this.companyId = companyId; }
public int getworkId() { return workId; }
public void setlworkId(int workId) { this.workId = workId; }
public string getName() { return name; }
public void setName(String name) { this.name = name; }
public String getGender() {
return gender;
}
public void setGender(String gender) { this.gender = gender; }
public String getPhoto() { return photo; }
public void setPhoto(String photo) { this.photo = photo; }
首先创建 JAVA B 叫做 person,person 里面定义了一些属性字段,companyId 公司的变化、功耗、姓名、性别、照片等等。提供了标准的构造器,还有 set 定量方法,这是一个普通的 java B。
import java.sq1.*;
public class Contants {
private static String JDBC DRIVER="com. cloudera. impala. jdbc41 .Driver";
private static String CONNECTION URL =" jdbc: impala://node-1:21050/defau1tjauth=noSasl";
//定义数据库连按
static Connection conn=nul1;
//定 XPreparedStatement 对象
static PreparedStatement ps-nu1l;
//定义查询的结果集
static ResultSet rs= null;
//数据库连接
public static Connection getCpnn(){
try {
Class . forName(JDBC_ DRIVER);
conn-DrivrManager . getConnection(CONNECTION URL);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
接下来看一下 ImpalaJDBCclient,在这个里面主要写了整个方法的,入口,写了一个 main 方法,首先通过它获得一个连接,并没有把所有代码都写在里面,而是分装了一个类,叫做 contants,这个类里面定义的非常多的方法,比如说要想去连接一个数据库,不管是 impala 还是 mysql,都要首先有驱动,注册驱动,然后获得连接,根据连接获得会话,发送最新的 sql,获得结果然后关闭连接。大概都是这些步骤,这里通过 JAVA 操作 impala,间接控制 kudu 也是一样的流程。首先定义了一些属性,JDBC 驱动的路径,还有连接的地址,这个是 impala 专用的地址。默认是default 库,下面连接的对象为空,咨询的对象以及结果集。这些都是 JDBC 相关的属性,首先,第一个方法是get conn,使用 class for name 注册驱动,通过 driver manager 获得链接,最后返回连接。
//创建一个表
public static void createTable(){
Conn=getConn();
String sq1="CREATE TABLE impala kudu test" +
"("+
"companyId BIGINT ," +
"workId BIGINT," +
"name STRING," +
"gender STRING," +
"photo STRING," +
"PRIMARY KEY(companyId)" +
")
”+
"PARTITION BY HASH PARTITIONS 16 " +
"STORED AS KUDU
"TBLPROPERTIES (" +
"'kudu. master_ addresses' - 'node-1:7051, node-2: 7051,node-3:7051'," +
"'kudu.table_ name' = ' impala kudu test'" +
");";
try {
ps = conn. prepareStatement(sq1);
ps .execute();
} catch (SQLException e) {
e. printStackTrace();
}
第一个是 get conn,获得一个连接,首先看第一个方法,创建一个表操作,创建一个表的方法是 create table,跳转进来,可以发现 create table 其实就是原始的 JDBC,通过 conn get 一个 conn 型,下面拼凑了一个 SQL 语句,需要注意的是 SQL 要求的是字符串类型,创建一个表,表名叫做 impala_kudu_test,主键是 company ID,表的属性是进行哈希分区分为16个区,存储在 kudu 当中。下面指定 kudu 的地址,表名为 impala_kudu_test,接下来到 kudu里面进行刷新,发现是没有这个表的。接下来执行这个语句能不能进行操作。
//插入数据
public static void insertRows (Person person){
conn=getConn();
Stringsql"insertintotableimpala_kudu_test(companyId
workId,name,gender,photo)values(?,?,?,?,?)";
try {
ps=conn. prepareStatement(sq1);
//给占位符?赋值
ps.setInt( parameterIndexc 1,person. getCompanyId());
ps. setInt( parameterIndex 2, person. getWorkId()); .
ps . setString( parameterIndexc 3,person.getName());
ps . setString( parameterIndexc 4,person. getGender());
ps.setString( parameterIndexc 5,person. getPhoto());
ps.execute();
} catch (SQLException e) {
e.printstackTrace();
}finally {
if(ps !=nu11){
try {
//关闭
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
if(conn !=nu11){
运行一下 conn 表,发现又回到了最原始的 jdbc 当中,执行成功以后,退出代码为零,首先,从 impala 当中做一个查询,用的是 default 库,使用 show tables,impala_kudu_test 表就已经有了,然后去 kudu 里面查看一下,刷新之后发现也有 impala_kudu_test 表,这样就通过 JAVA API,间接的在 impala 中创建了一个表,但是最终这个表是存储在 kudu 的。再往下看都是大同小异了。
创建完成以后,要去插入数据,插入数据调用的是 insert rows 方法,下面看一下 insertrows 插入数据是怎么插入的,Insert rows,需要指定插入对象,获得一个连接,语序是 insert into table,然后指定相应字段,接下来给占位符赋值,根据字段的 index 进行获取的。接下来看一下能不能把数据插入进去,对象是 new person,指定相关编号,右键进行 run,执行结果退出状态为零,成功以后,在 impala 里面进行验证,输入以下代码。
剩下几个就不再过多演示,因为都非常简单,比如说查询表的结构,使用的语句是 queryrows,查询过程当中,最重要的就是语句如何定义,执行语句,把结果作一个解析。
//查询数据
public static ResultSet queryRows(){
try {
//定义执行的 sql 语句
String sq1="select
亭 from impala kudu_ test" ;
ps = getConn(). prepareStatement(sql);
rs- ps .ekecuteQuery();
} catch (SQLException e) {
e. printStackTrace();
}
return rs;
同样后面的更新数据需要使用 updaterows 语句,都是语句的分发。
总结来说,如果想要使用 impala 操作 kudu,在 JAVA 层面,主要是编写非常原始的 JDBC 连接,其中,比较困难的是 impala 驱动,必须要去 kudu 官网下载,有了这个驱动,其他连接完全可以照抄 Mysql 的操作,就是创立连接拼接 SQL,执行结果,解析结果,关闭连接。