1

对不起我的英语不好...

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

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

4

1 回答 1

2

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

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

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

然后,将以下选项添加到 sqoop 导入以指定 'message_key' 应视为字符串。

     --map-column-java message_key=String

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

于 2013-04-18T23:44:12.753 回答