java操作Hive数据导入到Mysql(不用sqoop工具)

  • Post author:
  • Post category:java


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;”,如果输出表中的信息,则表示导入成功!

感谢观看!!



版权声明:本文为guihua55原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。