2

pig を使用してテキスト パターンを保存する方法を探しています。次のような入力があるとします。

ae988852ed9eabe3b5298d8b4c3b652e    I Never In My Life Gave A Guy No Money For Gas Or Food besides That Simpson Guy SMH I Fault Myself Though

このデータから、一連の単語パターンを抽出してバッグに保存したいと考えています。たとえば、{i, never} が最初で、{never, in} が 2 番目というようになります。次のようなプログラムでプログラムを開始することを知っています。

myinput = LOAD '/user/hive/warehouse/twitter_raw/$date' USING PigStorage('\t') AS (id,  mess);
strings = FOREACH myinput GENERATE $0 AS id, LOWER($1) AS mess;

しかし、これの次のステップは何でしょうか?

4

1 に答える 1

1

おそらく組み込み関数のみをトリッキーな方法で使用することで結果を得ることができますが、単純な UDF でも同じことができます。

public class SlidingTuple extends EvalFunc<DataBag> {

    private static final BagFactory bagFactory = BagFactory.getInstance();
    private static final TupleFactory tupleFactory = TupleFactory.getInstance();

    @Override
    public DataBag exec(Tuple input) throws IOException {
        try {
            DataBag inputBag = (DataBag) input.get(0);
            DataBag result = null;
            if (inputBag != null) {
                result = bagFactory.newDefaultBag();
                Iterator<Tuple> it = inputBag.iterator();
                Tuple previous = it.next();
                while (it.hasNext()) {
                    Tuple current = it.next();
                    Tuple tuple = tupleFactory.newTuple(2);
                    tuple.set(0, previous.get(0));
                    tuple.set(1, current.get(0));
                    result.add(tuple);
                    previous = current;
                }
            }
            return result;
        }
        catch (Exception e) {
            throw new RuntimeException("SlidingTuple error", e);
        }
    }
}

それで:

A = LOAD '/user/hive/warehouse/twitter_raw/$date' USING PigStorage('\t') 
      AS (id:chararray,  mess:chararray);

B = foreach A generate TOKENIZE(mess, ' ') as words;

次に、カスタム UDF を使用します。

C = foreach B generate com.example.SlidingTuple(words);
于 2012-09-22T12:35:41.847 に答える