第一步:HBase安裝Phoenix插件
HBase安裝Phoenix的流程可以自行百度。有很多,就不說了。
第二步:在JAVA項目中添加依賴
在Linux中正常連接訪問到Phoenix後,在項目中添加依賴【注意依賴的版本要和你安裝的版本大致相同】
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.phoenix/phoenix -->
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix</artifactId>
<!-- 這裏注意要和你安裝的Phoenix版本號相同 -->
<version>4.14.0-cdh5.11.2</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.apache.phoenix</groupId>
<artifactId>phoenix-core</artifactId>
<!-- 這裏注意要和你安裝的Phoenix版本號相同 -->
<version>4.14.0-cdh5.11.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
</dependencies>
第三步:編寫Phoenix工具類
【注意】Phoenix依賴一個Hadoop的外部依賴插件hadoop-common-2.2.0-bin-master。該外部依賴自行百度下載,解壓後即可。
需要設置成爲系統的全局變量。在Java中進行引入:System.setProperty(“hadoop.home.dir”, “D:\develop\hadoop\hadoop-common-2.2.0-bin-master”);
3.1先測試連接
/**
* 創建Phoenix連接
* @param ip zookeeper地址
* @param hadoopCommonUrl HadoopCommon的url
* @param schema 查詢的Schema前綴(沒有可爲空字符串)
* @return 成功後的連接信息
* @throws ClassNotFoundException E
* @throws SQLException E
*/
public java.sql.Connection connectionPhoenix(String ip, String hadoopCommonUrl, String schema) throws ClassNotFoundException, SQLException {
System.setProperty("hadoop.home.dir", hadoopCommonUrl);
Class.forName("org.apache.phoenix.jdbc.PhoenixDriver");
java.sql.Connection conn = DriverManager.getConnection("jdbc:phoenix:" + ip);
if (!StringUtils.isEmpty(schema)) {
conn.setSchema(schema);
}
return conn;
}
3.2嘗試發送SQL語句
/**
* 發送SQL語句查詢信息
* @param conn 創建好的Phoenix連接
* @param schema 要查詢的所屬Schema(如果有前綴就就加,沒有就不加)
* @param sql 要發送的SQL語句(select * from tableName)
* @return 查詢後的結果
* @throws SQLException E
*/
public ResultSet sqlPhoenix(java.sql.Connection conn, String schema, String sql) throws SQLException {
conn.setSchema(schema);
Statement stmt = conn.createStatement();
return stmt.executeQuery(sql);
}
3.3根據返回的查詢結果,獲取表中的字段信息
try {
//獲取表中的字段信息
PhoenixResultSet resultSet = (PhoenixResultSet)hBaseUtil.sqlPhoenix(conn, schema, ("select * from " + table));
//這裏用到了JAVA反射,因爲字段信息集合在jar依賴中是private類型,所以通過反射來獲取到他的字段名稱信息【工具類在下方】
RowProjector row = (RowProjector) ReflectionUtil.getPrivateField(resultSet, "rowProjector");
List<? extends ColumnProjector> column = row.getColumnProjectors();
//String[] arry = new String[column.size()];
for (int i = 0; i < column.size(); i++) {
System.out.println("這是字段信息 ====>" + column.get(i).getName());
//arry[i] = column.get(i).getName();
}
}catch (PhoenixParserException e){
System.out.println("不允許查詢的:" + table);
}finally {
System.out.println("*****************分割符************");
}
附:JAVA反射工具類
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @explain JAVA反射工具類
* @author Song
* @date 2019/12/17
*/
public class ReflectionUtil {
/**
* 獲取私有成員變量的值
* @param instance 要獲取的對象
* @param filedName 獲取的變量名稱
* @return 返回獲取變量的信息(需要強轉)
*/
public static Object getPrivateField(Object instance, String filedName) throws NoSuchFieldException, IllegalAccessException {
Field field = instance.getClass().getDeclaredField(filedName);
field.setAccessible(true);
return field.get(instance);
}
/**
* 設置私有成員的值
* @param instance 要獲取的對象
* @param fieldName 要獲取的變量名
* @param value 設置的值
*/
public static void setPrivateField(Object instance, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
Field field = instance.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(instance, value);
}
/**
* 訪問私有方法
* @param instance 要獲取的對象
* @param methodName 私有方法的名稱
* @param classes CLASS的返回信息
* @param objects 參數信息
* @return
*/
public static Object invokePrivateMethod(Object instance, String methodName, Class[] classes, String objects) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
Method method = instance.getClass().getDeclaredMethod(methodName, classes);
method.setAccessible(true);
return method.invoke(instance, objects);
}
}
時間原因,下班啦,趕緊回家,就先這樣。稍後在更新。