hive导入mysql相比大家直接想到的是利用sqoop工具直接进行传输,而此次博主给大家带来的直接使用java代码利用jdbc直接读hive数据并导入mysql,期间没有使用sqoop工具,那具体怎么做呢?
首先:
1、我们的hive表为
dblab
数据库的
bigdata_use
r表,首先为保证数据的容错性,我们需要使用临时表,不直接使用源表,我们在hive创建临时表:
user_action
create table dblab.user_action(id STRING,uid STRING, item_id STRING, behavior_type STRING, item_category STRING, visit_date DATE, province STRING) COMMENT ‘Welcome to lirui dblab! ‘ ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’ STORED AS TEXTFILE;
2、该临时表的字段属性必须跟源表
bigdata_use
r字段属性一致,该表其实就算源表的复制表,我们先把
bigdata_user
表中的数据插入到user_action中:
INSERT OVERWRITE TABLE dblab.user_action select * from dblab.bigdata_user;
运行结果如下:
查询数据内容跟源表一致
3、进入mysql创建我们要导入数据的表来接收hive的数据,在MySQL的dblab数据库下的user_action
CREATE TABLE `dblab`.`user_action` (`id` varchar(50),`uid` varchar(50),`item_id` varchar(50),`behavior_type` varchar(10),`item_category` varchar(50), `visit_date` DATE,`province` varchar(20)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4、 创建成功后,开始我们的代码书写:
本代码所需jar包为jdbc的jar包,小伙伴们自行去下载!
import java.sql.*;
import java.sql.SQLException;
public class HivetoMySQL {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
private static String driverName_mysql = "com.mysql.jdbc.Driver";
public static void main(String[] args) throws SQLException {
try {
Class.forName(driverName);
}catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.exit(1);
}
Connection con1 = DriverManager.getConnection("jdbc:hive2://master:10000/default", "root", "123456");//后两个参数是用户名密码
if(con1 == null)
System.out.println("连接失败");
else {
Statement stmt = con1.createStatement();
String sql = "select * from dblab.user_action";
System.out.println("Running: " + sql);
ResultSet res = stmt.executeQuery(sql);
//InsertToMysql
try {
Class.forName(driverName_mysql);
Connection con2 = DriverManager.getConnection("jdbc:mysql://master:3306/dblab","root","123456");
String sql2 = "insert into user_action(id,uid,item_id,behavior_type,item_category,visit_date,province) values (?,?,?,?,?,?,?)";
PreparedStatement ps = con2.prepareStatement(sql2);
while (res.next()) {
ps.setString(1,res.getString(1));
ps.setString(2,res.getString(2));
ps.setString(3,res.getString(3));
ps.setString(4,res.getString(4));
ps.setString(5,res.getString(5));
ps.setDate(6,res.getDate(6));
ps.setString(7,res.getString(7));
ps.executeUpdate();
}
ps.close();
con2.close();
res.close();
stmt.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
con1.close();
}
}
5、执行需要一段时间,执行完成后在MySQL数据库中执行“select * from user_action limit 10;”,如果输出表中的信息,则表示导入成功!
感谢观看!!