如何修改sqoop导入中的查询内容?

时间:2012-09-15 23:03:06

标签: import hbase sqoop

抱歉我的英语不好......

这是我的问题。我必须将数据从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中的一个表中?

感谢您耐心阅读这个长期的问题。

1 个答案:

答案 0 :(得分:2)

我通过以下方式解决了类似的问题:

首先,concat()可以帮助将两列合二为一,语法如下

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

然后,将以下选项添加到sqoop import以指定'message_key'应被视为String。

     --map-column-java message_key=String

希望它可以提供帮助。感谢。