纠正网上一些hive-jdbc的使用方法。
说明:网上一些文章基本都是抄来抄去的。很不规整。jdbc本身不需要引用hadoop的jar包。因为所有jdbc的使用都是通过java的spi机制构建的。这就是为什么在使用hive-jdbc时要先将hive的类名写出来。所有的jdbc都是共用一套链接方式,只不过对于数据集的处理需要不同的驱动进行,这些驱动创建的对象就是通过spi机制反射出来的。
重点:1.表的信息获取 2.表字段数据如何获取
注意:hive的jdbc需要使用日志系统来读取数据,所以在resources文件夹中保存一个log4j2.properties文件。
//hive的jdbc maven地址,注意版本要对应
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>3.1.2</version>
</dependency>
import java.sql.*;
public class num1 {
public static String url = "jdbc:hive2://xxx.xxx.xxx.xxx:10000";
public static String driverName = "org.apache.hive.jdbc.HiveDriver";
public static String u = "";
public static String p = "";
//jdbc使用的spi机制创建的对象
//hive的jdbc需要使用到log4j2.properties进行获取数据
//maven中的引用只需要hive的jdbc即可,其他的都不需要。
public static void main(String[] args) throws SQLException, ClassNotFoundException {
//因为使用spi机制,需要把使用的jdbc类告诉给类加载器。
Class.forName(driverName);
//统一使用java自带的连接器去连接,然后通过多态的形式将对象赋给hive的jdbc进行使用。
Connection connection = DriverManager.getConnection(url, user, password);
//创建状态。
Statement statement = connection.createStatement();
//状态提交sql返回一个ResultSet,这个ResultSet保存在返回数据的所有信息。
ResultSet show_databases = statement.executeQuery("select * from shijianqi.users");
//Metastore里面存储着表中列的所有信息
ResultSetMetaData metaData = show_databases.getMetaData();
//例如获取列的个数
System.out.println(metaData.getColumnCount());
//使用迭代器的方式获取所有行的信息,注意第一个result是空的。必须要先移动一位才能拿到数据。
//列的数据也要从1开始获取。
while (show_databases.next()){
for(int i=0;i<metaData.getColumnCount();i++){
System.out.print(show_databases.getString(i+1) + " \t");
}
System.out.println("");
}
}
}