根据pig中的数据将关系拆分为不同的输出文件

k3bvogb1  于 2021-06-24  发布在  Pig
关注(0)|答案(1)|浏览(276)

目前,我的数据如下:

  1. 1 A a
  2. 1 A b
  3. 2 B b
  4. 2 B c
  5. 3 A a
  6. 3 B b
  7. 3 C c

我想根据第一列中的数据将它们存储在不同的文件中。所以,我希望我的输出与此类似 1.out 包含

  1. A a
  2. A b
  3. ``` `2.out` 包含

B b
B c
``` 3.out 包含

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

使用带/不带自定义项的清管器是否可以实现这一点?
非常感谢你。

gopyfrb3

gopyfrb31#

我现在不使用群集,所以我不能100%确定,但这应该是正确的路径:

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

如果这样做,那么将创建3个目录(用于1、2和3),并且在这些目录中,只有与文件夹名称编号相同的文件才会位于这些目录下。但是,在每个目录中都可以有许多不同的文件(每个mapper/reducer对应一个文件)。此外,还必须存储字段0。因此,输出可以如下所示:

  1. --myOutputDir
  2. |
  3. |-->1
  4. | |-->1-00000 #Contains 1 A a
  5. | |-->1-00001 #Contains 1 A b
  6. |
  7. |-->2
  8. | |-->2-00000 #Contains 2 B b
  9. | |-->2-00001 #Contains 2 B c
  10. |
  11. |-->3
  12. | |-->3-00000 #Contains 3 A a, 3 B b
  13. | |-->3-00001 #Contains 3 C c
  14. |

3-00000的内容:

  1. 3 A a
  2. 3 B b

但是,由于您知道输出文件的名称,因此可以加载您创建的每个输出目录,并根据需要对其进行格式化:

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

所以现在输出结果如下所示:

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

但根据Map程序作业的数量,数据仍然可以在多个文件中分割。如果它们需要在同一个文件中,我建议编写一个脚本,将这些部分合并在一起。我使用这样的东西(但显然更一般):

  1. import os
  2. import glob
  3. partfiles = os.path.join('myOutputDir', 'stripped3', 'part-m-[0-9]*')
  4. with open('part-m-COMPLETE-3', 'w') as outfile:
  5. for myfile in glob.glob(partfiles):
  6. with open(myfile, 'r') as infile:
  7. for line in infile:
  8. outfile.write(line)
展开查看全部

相关问题