1

英語が下手でごめんなさい...

これが私の問題です。MySQLからHBaseにデータをインポートする必要があります。パフォーマンスを向上させるために、MySQLでは大きなテーブルがいくつかの小さなテーブルに分割されています。たとえば、「message」テーブルは「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ソースを変更して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の1つのテーブルにデータをインポートするには、マップされたジョブを自分で作成する必要がありますか?

この長い質問をお読みいただき、ありがとうございます。

4

1 に答える 1

2

同様の問題を次の方法で解決しました。

まず、concat() は 2 つの列を 1 つに結合するのに役立ちます。構文は次のとおりです。

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

次に、次のオプションを sqoop import に追加して、「message_key」が文字列と見なされるように指定します。

     --map-column-java message_key=String

それが役立つことを願っています。ありがとう。

于 2013-04-18T23:44:12.753 に答える