对不起我的英语不好...
这是我的问题。我必须将数据从 MySQL 导入 HBase。为了提高性能,在 MySQL 中将一个大表划分为一些小表。例如,一个'message'表被分为'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 中的一个表中?
感谢您耐心阅读这个长长的问题。