1

私は次のことを行います:

a = load '/hive/warehouse/' USING PigStorage('^') as (a1,b1,c1);

b = group a by (a1) ;

c = foreach b generate group, a.$2;

dump c;

出力にはすべてのグループが表示されます。

abc  {(1),(44),(66)}
cde  {(1),(44),(66)}

最終的な HDFS ファイルをカンマ区切りファイルとして読み取ることができるように、「{」および「(」文字を削除するにはどうすればよいですか?

4

3 に答える 3

3

Pig で直接これを行うことはできません。バッグを格納しているため、特別な構文が必要です。Pig が後でこのバッグを読み取れるようにするには、中括弧 (バッグの場合) と括弧 (バッグに含まれるタプルの場合) を使用して格納する必要があります。

いくつかのオプションがあります。ファイルを Pig に読み戻すことはできますが、 としてではなく、 としてbag読み取りますchararray。次に、正規表現置換を実行して句読点を取り除くことができます (未テスト):

a = LOAD 'output' AS (group:chararray, list:chararray);
b = FOREACH A GENERATE group, REPLACE(list, '[{()}]', '');

もう 1 つのオプションは、バッグをタプルに変換する UDF を作成することです。これは明確に定義された操作ではないことに注意してください。バッグには特定の順序がないため、ある実行から次の実行まで、タプルが同じ順序であるとは限りません。しかし、あなたの目的にとっては、それは問題ではないように思えます。UDF は次のようになります (非常にラフなドラフトであり、テストされていません)。

public class BAG_TO_TUPLE extends EvalFunc(Tuple) {
    public Tuple exec(Tuple input) {
        DataBag bag = input.get(0);
        Iterator<Tuple> iterator = bag.iterator();

        Tuple out = new DefaultTuple();
        while(iterator.hasNext()) {
            out.append(iterator.next().get(0));   
        }

        return out;
    }
}

上記のUDFはひどいものです.バッグのすべてのタプルに(あなたが気にする)ちょうど1つの要素があると仮定し、入力が有効であることなどをチェックしません.しかし、あなたが望むものに近づくはずです.

ただし、最善の解決策は、Pig がダウンストリーム処理の一部ではない場合、Pig の外部で余分な句読点を処理する方法を見つけることです。

于 2013-01-28T22:35:41.357 に答える
1

この機能は、組み込み関数として Pig で提供されるようになりました (私は 0.11 を使用しています)。

http://pig.apache.org/docs/r0.11.0/api/org/apache/pig/builtin/BagToString.html

c = foreach b generate group, a.$2 as stuff;
d = foreach c generate group, BagToString(stuff, ',');

私のユースケースではコンマ区切りのファイルは必要ありませんが、store func を使用して最後のコンマを取得できると思います (グループとバッグの現在のコンマ区切りリストの間)。

于 2014-05-12T17:16:37.057 に答える
0

FLATTEN 演算子を試してください。

c = foreach b 生成グループ、FLATTEN(a.$2);

于 2013-01-28T20:12:22.977 に答える