使用Java从Hive Table读取记录(通过Hivemetastoreclient或Hcatalog或WebHcat)

时间:2016-04-19 20:03:08

标签: java hadoop hive hcatalog

一个Hive表t_event位于demo_read数据库中。表有超过100,000条记录。如何通过java API读取记录。

2 个答案:

答案 0 :(得分:0)

嗯,实际上你并不想阅读所有数据。您需要对其进行转换并上传到某个数据库或(如果数据相对较小)将其导出为通用格式(CSV,JSON等)。

您可以使用Hive CLI,WebHCat或JDBC Hive驱动程序转换数据。

答案 1 :(得分:0)

您可以使用Hive JDBC驱动程序连接到Hive表。可以使用下面的代码进行测试或POC,但我建议将结束表移动到HBase(检查Phoenix)或MongoDB或某种基于关系的表,这些表具有低延迟。

您还可以在Hive中使用动态分区或某种群集技术以获得更好的性能。您可以使用以下代码,我尚未对其进行测试(将其用作示例)。

 package org.hive.utils;

 import java.sql.*;

 public class HiveDB {

 public static final String HIVE_JDBC_DRIVER = "org.apache.hadoop.hive.jdbc.HiveDriver";
 public static final String HIVE_JDBC_EMBEDDED_CONNECTION = "jdbc:hive://";
 private static String driverName = "org.apache.hadoop.hive.jdbc.HiveDriver";

 private Statement getConnection() throws ClassNotFoundException,
            SQLException {
        Class.forName(HIVE_JDBC_DRIVER);
        Connection connection = DriverManager.getConnection(
                HIVE_JDBC_EMBEDDED_CONNECTION, "", "");

        Statement statement = connection.createStatement();
        return statement;
    }

    public static void main(String[] args) {
       HiveDB hiveDB = new HiveDB();
       try {
         Statement statement = hiveDB.getConnection();
         //print each row
         ResultSet resultSet = statement.executeQuery("select * from demo_read.t_event");
         int columns = resultSet.getMetaData().getColumnCount();
         while (resultSet.next()) {
           for ( int i = 0 ; i < columns; ++i) {
              System.out.print(resultSet.getString(i + 1) + " " );
              if (i == 100) break; //print up to 100th rows
           }
           System.out.println();
         }
        statement.close; //close statement
      } catch (ClassNotFoundException e) {
         //
      } catch (SQLException e) {
         //
      }
    }

 }