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 の外部で余分な句読点を処理する方法を見つけることです。