龙空技术网

MySQL数据导入Hive-Java

程序猿开发日记 341

前言:

现时小伙伴们对“hive连接jdbc”大致比较注意,各位老铁们都需要剖析一些“hive连接jdbc”的相关文章。那么小编同时在网上搜集了一些对于“hive连接jdbc””的相关内容,希望看官们能喜欢,你们快快来学习一下吧!


MySQL数据导入Hive

文章来源:

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

Sqoop并不在这篇文章的范围内,拿出来说的原因是,在公司数据研发大佬告诉我公司的数据库数据是通过Sqoop导入到Hive中,百度了一下,发现其原理是将数据库数据导入到HDFS中临时存储,然后在将文件导入到Hive中,最终删掉临时存储的文件。

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

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

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

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的过程,在上一篇中也讲解过,这里只展示代码

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要简单容易。

标签: #hive连接jdbc