Pig でフィールドを行に変換したい。
input.txt から
1 2 3 4 5 6 7 8 9
フィールド間の区切りは '\t' です。
output.txtに
1 2 3 4 ... しかし、フィールドの内容が文である可能性があるため、TOKENIZER を使用してはなりません。私を助けてください。どうもありがとう。
Pig でフィールドを行に変換したい。
input.txt から
1 2 3 4 5 6 7 8 9
フィールド間の区切りは '\t' です。
output.txtに
1 2 3 4 ... しかし、フィールドの内容が文である可能性があるため、TOKENIZER を使用してはなりません。私を助けてください。どうもありがとう。
アレクセイパブの答えは正しい方向だと思います。簡単な例を次に示します。
> A = load 'input.txt';
> dump A
(0,1,2,3,4,5,6,7,8,9)
> B = foreach A generate FLATTEN(TOBAG(*));
> dump B
(0)
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
Pigを使用して非常によく似た問題が発生しました。私がやったことはUDFを書くことでした、それは単にタプルを反復するでしょう。タプル内のフィールドごとに、フィールド値を使用して新しいタプルを作成し、それをデータバッグに追加します。これがサンプルです...
public DataBag exec(Tuple tuple) throws IOException {
DataBag db = BagFactory.getInstance().newDefaultBag();
for(int i = 0; i < tuple.size(); ++i){
DefaultTuple dt = new DefaultTuple();
dt.append(tuple.get(i));
db.add(dt);
}
return db;
}
明らかに、これはサンプルであるためエラーチェックは含まれていませんが、これを行う方法を理解するのに役立ちます。
スクリプトでは、結果を「フラット化」し、必要に応じて単一の値を個々のタプルに戻すことができます。
DataFu UDF TransposeTupleToBag ( http://datafu.incubator.apache.org/docs/datafu/1.1.0/datafu/pig/util/TransposeTupleToBag.html ) を使用して、転置されたタプルからのフィールドを含むバッグを取得します。(key:chararray, value:chararray) タプルで行を取得するには、バッグをフラット化します。フラット化された出力から「値」部分を選択します。
行をピボットしたいようです。Apache Pig を使用したピボット テーブルまたはPigでタプルを複数のタプルに分割する方法を参照してください。