2

現在、私のデータは次のようになっています。

1 A a
1 A b
2 B b
2 B c
3 A a
3 B b
3 C c

最初の列のデータに応じて、これらを別のファイルに保存したいと考えています。だから、私は私の出力がこれに似ていることを望みます

1.out含む

A a
A b

2.out含む

B b
B c

3.out含む

A a
B b
C c

UDF の有無にかかわらず Pig を使用してこれを達成する方法はありますか?

どうもありがとうございました。

4

1 に答える 1

5

現在使用しているクラスターから離れているため、100% 確実とは言えませんが、これは正しいパスにあるはずです。

-- Assuming myData.txt is formatted like:
-- 1 A b
-- 2 B c
-- etc.
A = LOAD 'myData.txt' USING PigStorage(' ') 
                      AS (number: int, val1: chararray, val2: chararray) ;
STORE A INTO 'myOutputDir'
        -- Stores using \t as the input separator
        USING org.apache.pig.piggybank.storage.MultiStorage('myOutputDir', '0') ;

このようにすると、3 つのディレクトリ (1、2、および 3) が作成され、それらのディレクトリには、フォルダーの名前と同じ番号のファイルのみがその下に置かれます。ただし、これらの各ディレクトリには、多数の異なるファイル (マッパー/リデューサーごとに 1 つ) が存在する可能性があります。さらに、フィールド 0 も保存する必要があります。したがって、出力は次のようになります。

--myOutputDir
|
|-->1
| |-->1-00000 #Contains 1 A a
| |-->1-00001 #Contains 1 A b
|
|-->2
| |-->2-00000 #Contains 2 B b
| |-->2-00001 #Contains 2 B c
|
|-->3
| |-->3-00000 #Contains 3 A a, 3 B b
| |-->3-00001 #Contains 3 C c
|

3-00000 の内容:

3   A   a
3   B   b

ただし、出力ファイルの名前がわかっているため、作成した各出力ディレクトリをロードして、必要に応じてフォーマットできます。

-- Repeat this for all the numbers
A3 = LOAD 'myOutputDir/3' AS (number: int, val1: chararray, val2: chararray) ;
B3 = FOREACH A3 GENERATE val1, val2 ; 
STORE B3 INTO 'myOutputDir/stripped3' ;

したがって、出力は次のようになります。

A    a
B    b
C    c

ただし、マッパー ジョブの数によっては、データを複数のファイルに分割することもできます。それらをすべて同じファイルに入れる必要がある場合は、パーツをマージするスクリプトを作成することをお勧めします。私はこのようなものを使用します(ただし、明らかにより一般的です):

import os
import glob
partfiles = os.path.join('myOutputDir', 'stripped3', 'part-m-[0-9]*')
with open('part-m-COMPLETE-3', 'w') as outfile:
    for myfile in glob.glob(partfiles):
        with open(myfile, 'r') as infile:
            for line in infile:
                outfile.write(line)
于 2013-07-09T03:58:08.733 に答える