Hive" ANALYZE TABLE"如何从java执行

时间:2015-11-05 18:42:59

标签: hadoop jdbc hive

我需要计算一个hive表中的行数 我正在使用查询:

y

我想通过java获取结果,我正在尝试使用以下内容 代码,没有运气。我得到的错误是:

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);
}
}

通过java。对此有任何帮助对我有很大帮助。感谢。

2 个答案:

答案 0 :(得分:1)

使用没有' NOSCAN'的ANALYZE TABLE语句计算行数。 注意:此语句不生成resultSet对象。

要获取存储的统计信息,请使用以下语句。

DESCRIBE FORMATTED tableName

在输出中,行数列在parameters数组中。使用正则表达式提取它。

以下是示例代码:

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

答案 1 :(得分:0)

尝试使用以下代码获取表格的行数:

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;

            }

希望有所帮助:)