JAVA使用Phoenix連接操作HBase工具類__獲取表字段信息等操作

第一步: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);
    }

}

時間原因,下班啦,趕緊回家,就先這樣。稍後在更新。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章