對不起,我可憐的英語...如何在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中的單個表中?
感謝您的耐心閱讀這個長期的問題。
嗨,你有沒有想過用MySQL創建視圖,然後從該視圖導入數據而不是每個表? –
@JpBond這聽起來不錯。儘管恐怕我的老闆不會買這個,但我會和他談談。非常感謝你。但是仍然有一些情況我必須自己編寫mapred作業。 – scarcer