目前,我的数据如下:
1 A a1 A b2 B b2 B c3 A a3 B b3 C c
1 A a
1 A b
2 B b
2 B c
3 A a
3 B b
3 C c
我想根据第一列中的数据将它们存储在不同的文件中。所以,我希望我的输出与此类似 1.out 包含
1.out
A aA b``` `2.out` 包含
A a
A b
``` `2.out` 包含
B bB c``` 3.out 包含
3.out
A aB bC c
B b
C c
使用带/不带自定义项的清管器是否可以实现这一点?非常感谢你。
gopyfrb31#
我现在不使用群集,所以我不能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') ;
-- 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),并且在这些目录中,只有与文件夹名称编号相同的文件才会位于这些目录下。但是,在每个目录中都可以有许多不同的文件(每个mapper/reducer对应一个文件)。此外,还必须存储字段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|
--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 a3 B b
但是,由于您知道输出文件的名称,因此可以加载您创建的每个输出目录,并根据需要对其进行格式化:
-- Repeat this for all the numbersA3 = LOAD 'myOutputDir/3' AS (number: int, val1: chararray, val2: chararray) ;B3 = FOREACH A3 GENERATE val1, val2 ; STORE B3 INTO 'myOutputDir/stripped3' ;
-- 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' ;
所以现在输出结果如下所示:
但根据Map程序作业的数量,数据仍然可以在多个文件中分割。如果它们需要在同一个文件中,我建议编写一个脚本,将这些部分合并在一起。我使用这样的东西(但显然更一般):
import osimport globpartfiles = 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)
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)
1条答案
按热度按时间gopyfrb31#
我现在不使用群集,所以我不能100%确定,但这应该是正确的路径:
如果这样做,那么将创建3个目录(用于1、2和3),并且在这些目录中,只有与文件夹名称编号相同的文件才会位于这些目录下。但是,在每个目录中都可以有许多不同的文件(每个mapper/reducer对应一个文件)。此外,还必须存储字段0。因此,输出可以如下所示:
3-00000的内容:
但是,由于您知道输出文件的名称,因此可以加载您创建的每个输出目录,并根据需要对其进行格式化:
所以现在输出结果如下所示:
但根据Map程序作业的数量,数据仍然可以在多个文件中分割。如果它们需要在同一个文件中,我建议编写一个脚本,将这些部分合并在一起。我使用这样的东西(但显然更一般):