2012-09-15 25 views
1

對不起,我可憐的英語...如何在sqoop導入中修改查詢內容?

這是我的問題。我必須將數據從MySQL導入HBase。爲了提高性能,一個大表在MySQL中被分成一些小表。例如,'消息'表被分成'message_0','message_1',...'message_100'。

我需要將這些消息表導入HBase中的單個表(例如「消息」)。每個表中的PK都是message_id,它是自動遞增的。我們知道,HBase有一個獨特的行鍵。我想爲message_id列添加一個前綴。

我無法在這些表中添加hbase-row-key列,以便我想修改sqoop查詢參數中的列內容。我用像下面的導入命令長相:

sqoop import --connect jdbc:mysql://host:port/message 
--username message --password message \ 
--query "select 't0_'+ message_id as message_key, some_split_id, some_other_columns\ 
from message_0 where message_id >30000 and message_id <= 31000 and \$CONDITIONS" 
--split-by some_split_id --hbase-row-key message_key 
--hbase-table message --column-family cf1 

我可以列別名message_key成功映射爲HBase的行鍵。但行鍵是30001.0,預計爲't0_30001'。

看來,查詢沒有返回't0_'+ message_id的期望值,而是直接返回message_id。

我也嘗試修改sqoop生成的Java源代碼,將't0_'添加到message_id,然後指定編譯後的類以執行輸入操作,但它也不適用。

看起來這

java源:

public void set_message_key(String message_key) { 
    this.message_key = "t0_" + message_key; 
} 
public MessageImporter with_message_key(String message_key) { 
    this.message_key = "t0_" + message_key; 
    return this; 
} 
... 
public void readFields(DataInput __dataIn) throws IOException { 
    if (__dataIn.readBoolean()) { 
     this.message_key = null; 
    } else { 
     this.message_key = "t0_" + Text.readString(__dataIn); 
    } 
    ... 
... 
} 
... 
private void __loadFromFields(List<String> fields) { 
    Iterator<String> __it = fields.listIterator(); 
    String __cur_str; 
    __cur_str = __it.next(); 
    if (__cur_str.equals("null") || __cur_str.length() == 0) { this.message_key = null; } else { 
    this.message_key = "t0_" + __cur_str; 
    } 
    ... 
} 
... 
public void setField(String __fieldName, Object __fieldVal) { 
    if ("message_key".equals(__fieldName)) { 
     this.message_key = "t0_" + (String) __fieldVal; 
    } 
    ... 
} 

命令行(在下面添加參數):

--jar-file someJar.jar --class-name com.foo.SomeImportClass \ 

是否有可能修改該--query參數列內容?我是否必須親自編寫映射作業才能將多個表中的數據導入HBase中的單個表中?

感謝您的耐心閱讀這個長期的問題。

+1

嗨,你有沒有想過用MySQL創建視圖,然後從該視圖導入數據而不是每個表? –

+0

@JpBond這聽起來不錯。儘管恐怕我的老闆不會買這個,但我會和他談談。非常感謝你。但是仍然有一些情況我必須自己編寫mapred作業。 – scarcer

回答

2

我解決了以下方式類似的問題:

首先,CONCAT()可以幫助兩列合併成一個,其語法遵循

 select concat('t0_',message_id) as message_key, ... 

然後,添加以下選擇sqoop import來指定'message_key'應該被認爲是String。

 --map-column-java message_key=String 

希望它能提供幫助。謝謝。