欢迎大家来到IT世界,在知识的湖畔探索吧!
文章来源:http://www.study-java.cn
上一篇文章我们使用通过beeline执行一些常规的HQL 今天这一篇文章主要来看如果通过Java将MySQL数据导入到Hive中。
欢迎大家来到IT世界,在知识的湖畔探索吧!
Sqoop
Sqoop并不在这篇文章的范围内,拿出来说的原因是,在公司数据研发大佬告诉我公司的数据库数据是通过Sqoop导入到Hive中,百度了一下,发现其原理是将数据库数据导入到HDFS中临时存储,然后在将文件导入到Hive中,最终删掉临时存储的文件。
而笔者并没有采用这种方式,原因很简单,我的目的是学习Hive,过多的用这些框架会增加了我的学习工具成本,所以我看了Sqoop的原理后,准备模仿一下,简单的实现数据的导入,过程如下:
- 连接MySQL
- 查询导入的数据
- 调用Hadoop的API将数据存入到HDFS中
- 将HDFS文件导入到Hive中
查询数据
这里我查询用户表的用户名称,年,月,日,并将结果集存入ResultSet中
欢迎大家来到IT世界,在知识的湖畔探索吧!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
对与Java操作HDFS的过程,在Hadoop入门中有过详细的讲解,这里不赘述了
//创建临时文件 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
连接Hive的过程,在上一篇中也讲解过,这里只展示代码
欢迎大家来到IT世界,在知识的湖畔探索吧!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你只是需要知道SQL操作即可,相对Hadoop要简单容易。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/17842.html