【发布时间】:2012-09-15 23:03:05
【问题描述】:
对不起我的英语不好......
这是我的问题。我必须将数据从 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源,在message_id中添加't0_',然后指定编译的类来执行输入动作,但它也不起作用。
看起来像这样
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 这听起来不错。虽然我怕我的老板不买这个,但我会和他谈谈。非常感谢你。但仍有一些情况我必须自己编写映射作业。