복붙노트

[HADOOP] 하이브 "ANALYZE TABLE"자바에서 실행하는 방법

HADOOP

하이브 "ANALYZE TABLE"자바에서 실행하는 방법

하이브 테이블의 행 수를 계산해야합니다. 쿼리를 사용하고 있습니다.

ANALYZE TABLE p_7 COMPUTE STATISTICS noscan

자바를 통해 결과를 가져오고 싶습니다. 아래에서 시도하고 있습니다. 코드와 운이 없다. 내가 얻는 오류는 :

Exception in thread "main" java.sql.SQLException: The query did not generate a result set!
at org.apache.hive.jdbc.HiveStatement.executeQuery(HiveStatement.java:393)
at HiveJdbcClient.main(HiveJdbcClient.java:22)

내가 사용하는 코드는 다음과 같습니다.

import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import java.sql.DriverManager;

public class HiveJdbcClient {
private static String driverName = "org.apache.hive.jdbc.HiveDriver";
public static void main(String[] args) throws SQLException {
    try {
        Class.forName(driverName);
    } catch (ClassNotFoundException e) {

        e.printStackTrace();
        System.exit(1);
    }
    Connection con = DriverManager.getConnection("jdbc:hive2://localhost:10000/default", "hive", "");
    System.out.println("connected");
    Statement statement = con.createStatement();
    String query = "ANALYZE TABLE p_7 COMPUTE STATISTICS noscan";
    ResultSet res = statement.executeQuery(query);
}
}

나 같은 쿼리를 실행하는 방법을 몰라 :

ANALYZE TABLE p_7 COMPUTE STATISTICS noscan

자바를 통해. 이것에 대한 도움은 나에게 큰 도움이 될 것입니다. 감사.

해결법

  1. ==============================

    1.'NOSCAN'없이 ANALYZE TABLE 문을 사용하여 행 수를 계산하십시오. 주 :이 명령문은 resultSet 오브젝트를 생성하지 않습니다.

    'NOSCAN'없이 ANALYZE TABLE 문을 사용하여 행 수를 계산하십시오. 주 :이 명령문은 resultSet 오브젝트를 생성하지 않습니다.

    저장된 통계를 가져 오려면 다음 문을 사용하십시오.

    DESCRIBE FORMATTED tableName
    

    출력에서 행 수는 parameters 배열에 나열됩니다. regex를 사용하여 추출하십시오.

    샘플 코드는 다음과 같습니다.

    String analyzeQuery = "ANALYZE TABLE p_7 COMPUTE STATISTICS";
    String describeQuery = "DESCRIBE FORMATTED p_7";
    
    stmt.execute(analyzeQuery);
    StringBuilder sb = new StringBuilder();
    try (ResultSet rs = stmt.executeQuery(describeQuery)) {
       while (rs.next()) {
           int count = rs.getMetaData().getColumnCount();
           for (int j = 1; j <= count; j++) {
              sb.append(rs.getString(j));
           }
       }
    }
    System.out.println("Output: "+ sb.toString());
    

    표 및 파티션 통계에 대한 자세한 내용은 https://cwiki.apache.org/confluence/display/Hive/StatsDev를 참조하십시오.

  2. ==============================

    2.표의 행 수를 얻으려면 아래 코드를 시도하십시오.

    표의 행 수를 얻으려면 아래 코드를 시도하십시오.

    public static Connection createConnection(String hive_ip)
            {
                String hive_url="jdbc:hive2://"+hive_ip;
                Connection con=null;
                try {
                    Class.forName("org.apache.hive.jdbc.HiveDriver");
                    System.out.println(hive_url+"/");
                    con = DriverManager.getConnection(
                            hive_url+"/",
                            hive_username,hive_password);
    
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
                return con;
            }
    
    
    
          public static int getHiveColumnRowCount(String tablename,String db_name)
                {
                    int count=0;
    
                    Connection con=createConnection();
    
                    try {
                        Statement st=con.createStatement();
    
                        int i=0;
                        String count_query="show tblproperties "+db_name+"."+tablename;
                        ResultSet rs=st.executeQuery(count_query);
                        while(rs.next())
                        {
                            i++;
                            if(i==3)
                            {
                            count=Integer.parseInt(rs.getString(2));
                            }
                        }
                        System.out.println("COUNT:"+count);
                        rs.close();
                        st.close();
                        con.close();
                    } catch (SQLException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
    
    
                    return count;
    
                }
    

    희망이 도움이 :)

  3. from https://stackoverflow.com/questions/33552345/hive-analyze-table-how-to-execute-from-java by cc-by-sa and MIT license