欢迎大家来到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