前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL数据导入Hive-Java

MySQL数据导入Hive-Java

作者头像
每天学Java
发布2020-06-02 10:21:42
2.2K0
发布2020-06-02 10:21:42
举报
文章被收录于专栏:每天学Java

文章来源:http://www.study-java.cn/

上一篇文章我们使用通过beeline执行一些常规的HQL,今天这一篇文章主要来看如果通过Java将MySQL数据导入到Hive中。

Sqoop

Sqoop并不在这篇文章的范围内,拿出来说的原因是,公司数据研发部门是通过Sqoop将数据库数据导入到Hive中,其原理是将数据库数据导入到HDFS中临时存储, 然后在将文件导入到Hive中,最终删掉临时存储的文件。

而笔者并没有采用这种方式,原因很简单,我的目的是学习Hive,过多的用这些工具会增加了我的学习工具成本,所以我看了Sqoop的原理后,准备模仿一下,简单的 实现数据的导入,过程如下:

  • 连接MySQL
  • 查询导入的数据
  • 调用Hadoop的API将数据存入到HDFS中
  • 将HDFS文件导入到Hive中
查询MySQL数据

这里我查询用户表的用户名称,年,月,日,并将结果集存入ResultSet中

代码语言:javascript
复制
        String driverclass = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://IP:3306/xcxvt?useSSL=false";
        String username = "root";
        String passwd = "pwd";
        //连接
        try {
            Class.forName(driverclass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.exit(1);
        }
        Connection con = DriverManager.getConnection(url, username, passwd);
        Statement stmt = con.createStatement();
        //查询
        StringBuffer sql = new StringBuffer();
        sql.append("select userName, ");
        sql.append("substring(create_time,1,4) as year,");
        sql.append("substring(create_time,6,2) as month,");
        sql.append("substring(create_time,9,2) as day ");
        sql.append("from user_info");
        ResultSet resultSet = stmt.executeQuery(sql.toString());
        StringBuffer data = new StringBuffer();
存入HDFS
代码语言:javascript
复制
        //创建临时文件
        BufferedWriter bw = null;
        File file = null;
        try {
            file = File.createTempFile("userInfo", ".txt");
            bw = new BufferedWriter(new FileWriter(file));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //写入字段,逗号隔开,这里和建表的字段分隔符一致
        bw.write("user_name,year,month,month");
        while (resultSet.next()) {
            data.setLength(0);
            data.append(resultSet.getString(1) + ",");
            data.append(resultSet.getString(2) + ",");
            data.append(resultSet.getString(3) + ",");
            data.append(resultSet.getString(4) + "\n");
            try {
                bw.write(data.toString());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        FileSystem fileSystem = FileSystem.get(new URI("hdfs://localhost:9000/"), new Configuration(), "chenlong");
        fileSystem.copyFromLocalFile(false, true, new Path(file.getPath()), new Path("/mysql"));
        //删除临时文件
        file.deleteOnExit();
            
导入Hive
代码语言:javascript
复制
        String driverName = "org.apache.hive.jdbc.HiveDriver";
        try {
            Class.forName(driverName);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.exit(1);
        }
        Connection con = DriverManager.getConnection("jdbc:hive2://127.0.0.1:12000/xcx_user_db", "chenlong", "");
        Statement stmt = con.createStatement();
        //导入非分区数据
        String importData = "load data inpath '/mysql' overwrite into table user_unpartition";
        int count = stmt.executeUpdate(importData);

到这里实现数据的导入

总结

通过API操作Hive之后,笔者发现他和Hadoop的区别在于:Hadoop是操作HDFS,也不是不能存到数据库中,但是我们需要了解Hadoop封装的类,但是Hive虽然也是将数据存入HDFS,但是你只是需要知道HQL操作即可。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 每天学Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Sqoop
  • 查询MySQL数据
  • 存入HDFS
  • 导入Hive
  • 总结
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档