一个Hive表t_event位于demo_read数据库中。表有超过100,000条记录。如何通过java API读取记录。
答案 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) {
//
}
}
}