2016-07-27 9 views
1

Ich habe den folgenden Code verwendet, um eine Verbindung zur Hive-Datenbank herzustellen. Der erste Teil beschreibt die Tabelle und der zweite Teil führt eine Auswahlabfrage aus. Die Select-Abfrage funktioniert einwandfrei, ruft jedoch keine Zeile ab.Hive-JDBC: Keine Zeilenausnahme beim Abrufen von Daten aus der Hive-Tabelle über die Hive-JDBC-Verbindung

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://hostname:10000", "mapr", "mapr"); 
     Statement stmt = con.createStatement(); 
     String tableName1 = "default.newEmployee"; 
     // describe table 
     String sql = null; 

     sql = "describe " + tableName1; 
     System.out.println("Running: " + sql); 
     ResultSet res = stmt.executeQuery(sql); 
     while (res.next()) { 
      System.out.println(res.getString(1) + "\t" + res.getString(2)); 
     } 

     // select * query 
     sql = "select name from " + tableName1; 
     System.out.println("Running: " + sql); 
     res = stmt.executeQuery(sql); 
     System.out.println("Complete"); 
     System.out.println("reslut "+res.getBoolean(0)); 
    } 
} 

Wenn ich mich anmelden und eine Auswahl machen, bekomme ich mehr als eine Million Zeilen. Jeder bitte vorschlagen, Wenn ich hier etwas falsch mache.

+0

Könnten Sie die Ausnahmemeldung? –

+0

Kannst du die Zeile 'System.out.println (res.getString (1) +" \ t "+ res.getString (2));' für diese 'System.out.println (res.getString (0) + "\ t" + res.getString (1)); '? –

+0

@JaimeCr Running: default.newEmployee Name \t Zeichenfolge Lauf beschreiben: select name from default.newEmployee Grenze 1 komplette Exception in thread "main" java.sql.SQLException: keine Zeile gefunden. \t bei org.apache.hive.jdbc.HiveBaseResultSet.getColumnValue (HiveBaseResultSet.java: 399) Grundsätzlich beschreiben beschreiben funktioniert gut. System.out.println (res.getString (1) + "\ t" + res.getString (2)) Dies druckt das erste und zweite Element aus der Antwort von describe, dh Spaltenname und seinen Datentyp. Problem tritt auf, wenn ich Daten mit Select – GauravVijay

Antwort

1

Ich habe eine Problemumgehung für dieses Problem gefunden. Anstatt eine Hive-JDBC Verbindung herzustellen, habe ich die Runtime.exec Methode in Java benutzt und es hat funktioniert.

Runtime.exec ("Bienenstock", "-e", "Query");

Ich habe immer noch nicht herausgefunden, warum die Hive-jdbc-Verbindung Fehler bei der Abfrage einer Tabelle zum Abrufen von Daten gibt. Warum funktioniert die Metastre-Operation wie "desc tablename"?

0

Nachdem er Weg zu viel Zeit mit einem sehr ähnlichen Problem: Sie können die Zeilen der Ergebnismenge holen muss, auch wenn es nur eine Zeile ist:

ResultSet rs = preparedStatement.getResultSet(); 

while (rs.next()) { 
    System.out.println(rs.getInt(1)); 
}