1. 程式人生 > >kettle從hive取數亂碼-問題解決方法(可下載改寫驅動)

kettle從hive取數亂碼-問題解決方法(可下載改寫驅動)

博主第一次使用kettle抽取hive中的資料時,遇到了取數結果亂碼的問題。

經查閱相關資料,大致有以下幾種解決辦法:

1、hive連線頁面設定characterEncoing=utf8。對關係型資料庫可能有用,但對hive測試無效;

2、修改hive連線驅動中的jar包:

相關資料:

先看下kettle是如何使用hive的jdbc連線的。經測試,在lib下、{kettle_home}\data-integration\plugins\pentaho-big-data-plugin\lib下加入hive的jdbc的jar包,會造成連線功能異常。在該目錄下存在jar檔案hive-jdbc-0.7.0-pentaho-1.0.2.jar,這個類是一個適配類,不真正實現hive的jdbc連線。而是通過反射的方式,找到classpath下的hivejdbc類,即存在於{kettlehome}\plugins\pentaho-big-data-plugin\hadoop-configurations\hadoop-20\lib\hive-jdbc-0.7.0-pentaho-1.0.2.jar這個jar檔案,該檔案用於真實的呼叫hive。

網上查資料說,可以先從以下url中獲取source檔案,http://repo.pentaho.org/artifactory/repo/org/apache/hive/hive-jdbc/0.7.0-pentaho-1.0.2/hive-jdbc-0.7.0-pentaho-1.0.2-sources.jar 下載解壓後,匯入到你自己的一個新建java工程中,並引入相關的類庫,可以使之正常編譯。

但實際上並不能找到這個source檔案,查遍整個搜尋引擎也還是沒能找到相關的jar包,因此樓主對jar包進行了反編譯-》重編譯。

我的實現步驟如下:

工具:反編譯工具jd-gui

    java IDE工具Eclipse

a、找到hive-jdbc-0.7.0-pentaho-1.0.2.jar這個jar包,把class檔案解壓在目錄中;

b、使用jd-gui反編譯class檔案為java原始碼檔案,儲存;

c、新建java工程,把java原始碼檔案匯入工程;

d、從hive-jdbc-0.7.0-pentaho-1.0.2.jar這個檔名可猜測,驅動是針對hive0.7.0進行修改的,引入hive、hadoop0.20的相關jar包,jdk使用1.5來編譯;

e、修改報錯的程式碼——反編譯的程式碼不一定是正確的,會有一定的語法錯誤。

f、修改HiveQueryResultSet.java為以下程式碼

1.StructObjectInspector soi = (StructObjectInspector) serde.getObjectInspector();
2.List fieldRefs = soi.getAllStructFieldRefs();
3.//Object data = serde.deserialize(new BytesWritable(rowStr.getBytes()));//我們將該行遮蔽
4.Object data = serde.deserialize(new BytesWritable(rowStr.getBytes("UTF-8")));//使用本行
g、替換原來包中的HiveQueryResultSet.class檔案,對所有的class檔案按原結構進行打為jar包

h、替換原先的路徑中的jar包就可以了。

樓主改好的jar包資源在這裡:

http://download.csdn.net/detail/l714417743/9369816