2014-12-29 4 views
-1

Я пытаюсь экспортировать данные из Hive в Teradata. Ниже приведен код, у меня есть для того же:executeQuery не возвращает результат для Hive

/* Code Start */ 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class HiveToTd { 
private final static String tdUser = "**********"; 
private final static String tdPass = "**********"; 

private final static String hiveUser = "**********"; 
private final static String hivePass = "**********"; 

private static String driverName = "org.apache.hive.jdbc.HiveDriver"; 
/** 
* @param args 
* @throws ClassNotFoundException 
* @throws SQLException 
*/ 
public static void main(String[] args) throws ClassNotFoundException, SQLException { 
    // Get the Teradata connection 
    Class.forName("com.teradata.jdbc.TeraDriver"); 
    Connection tdcon = DriverManager.getConnection("jdbc:teradata://database.XXXXX.com/TMODE=ANSI,TYPE=FASTLOAD", tdUser, tdPass); 
    System.out.println("Connected to Teradata."); 

    // Get our hive connection 
    Class.forName(driverName); 
    System.out.println("Connecting to Hive."); 
    Connection hivecon = DriverManager.getConnection("jdbc:hive2://bigdatabase.xxxxxx.com:10000/default", hiveUser, hivePass); 
    System.out.println("Connected to Hive."); 

    // Select our table from Hive 

    Statement hst = hivecon.createStatement(); 
    System.out.println("Executing Statement"); 
    ResultSet hrs = hst.executeQuery("SELECT COL1, COL2, COL3 FROM db.table limit 100"); 

    System.out.println("Get DATA"); 
    int count= 0; 
    if(hrs.next()) 
    { 
     count++; 
    } 
    System.out.println(count); 

Количество возвращается «1», а не 100. Я проверил, что у меня есть более 1 миллиона записей в таблицах в улье. Что я делаю не так? Он просто возвращает мне строку заголовка, и вот она. Я бы предположил, что проблема связана с соединением, но затем она дает мне правильную строку заголовка. Так что это должно быть что-то еще.

Мне нужно решить это срочно .... Спасибо, кучи!

Похоже, что код действительно работает. Спасибо, что помогли мне устранить проблему.

Следующая часть более беспокоит. Это для быстрой загрузки в TD.

// Empty the staging table 
    tdcon.createStatement().executeUpdate("delete from dbname.staging_table"); 

    // Create prepared statement for Teradata 
    System.out.println("Begin load to Teradata"); 
    tdcon.setAutoCommit(false); 

    PreparedStatement ps = tdcon.prepareStatement("insert into dbname.staging_table values (?,?,?)"); 
    System.out.println("Start Fastload"); 
    int i; 
    for (i = 1; hrs.next(); i++){ 
     ps.setString(1, hrs.getString(1)); 
     ps.setString(2, hrs.getString(2)); 
     ps.setString(3, hrs.getString(3)); 
     ps.addBatch(); 
     System.out.println(i); 
     if (i % 10000 == 0){ 
      ps.executeBatch(); 
     } 
    } 



    if (i % 10000 != 0){ 
     ps.executeBatch(); 
    } 



    tdcon.commit(); 
    tdcon.setAutoCommit(true); 
    ps.close(); 
    hrs.close(); 

    sideLoad("dbname.staging_table", "dbname.final_table", tdcon); 
    tdcon.close(); 
    hivecon.close(); 

} 

public static int sideLoad(String fromTable, String toTable, Connection conn) throws SQLException{ 
    return (conn.createStatement().executeUpdate("INSERT INTO " + toTable + " SELECT * FROM " + fromTable)); 

} 

}

Я получаю ошибку после того, как сообщение «начать FastLoad» является:

Exception in thread "main" java.sql.SQLException: [Teradata JDBC Driver] [TeraJDBC 15.00.00.20] [Error 1103] [SQLState HY000] Cannot add an empty batch of rows to a database table 
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:94) 
    at com.teradata.jdbc.jdbc_4.util.ErrorFactory.makeDriverJDBCException(ErrorFactory.java:64) 
    at com.teradata.jdbc.jdbc.fastload.FastLoadManagerPreparedStatement.executeBatch(FastLoadManagerPreparedStatement.java:2049) 
    at com.optus.insights.HiveToTd.main(HiveToTd.java:84) 

ответ

0

Вы испытываете if состояние так сосчитать будет идти только в первой строке ResultSet и счетчик прироста 1

Если вы хотите итерации по всем строкам, используйте while loop вместо if изменяет свой код следующим образом

while(hrs.next()){ 
    count++; 
} 
+0

Однако, когда я отладки кода, показывает набор результатов ни одна строка не принесла –

+0

непосредственно выполнить запрос и проверить, если вы получите данные –

+0

сделано, и это делает ... –