抱歉我的英语不好......
这是我的问题。我必须将数据从MySQL导入HBase。为了提高性能,一个大表分为MySQL中的一些小表。例如,“消息”表格分为“message_0”,“message_1”,...“message_100”。
我需要将这些消息表导入HBase中的单个表(例如'message')。每个表中的PK都是message_id,它是自动递增的。我们知道,HBase有一个唯一的行键。我想在message_id列中添加前缀。
我无法在这些表中添加hbase-row-key列,因此我想修改sqoop查询参数中的列内容。我使用了import命令,如下所示:
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 source:
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参数中的列内容?我是否必须自己编写mapred作业,以便将多个表中的数据导入HBase中的一个表中?
感谢您耐心阅读这个长期的问题。
答案 0 :(得分:2)
我通过以下方式解决了类似的问题:
首先,concat()可以帮助将两列合二为一,语法如下
select concat('t0_',message_id) as message_key, ...
然后,将以下选项添加到sqoop import以指定'message_key'应被视为String。
--map-column-java message_key=String
希望它可以提供帮助。感谢。