【问题标题】:How to modify query content in sqoop import?sqoop导入中如何修改查询内容?
【发布时间】: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 这听起来不错。虽然我怕我的老板不买这个,但我会和他谈谈。非常感谢你。但仍有一些情况我必须自己编写映射作业。

标签: import hbase sqoop


【解决方案1】:

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

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

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

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

     --map-column-java message_key=String

希望对您有所帮助。谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2023-03-13
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多