我是Hadoop / Pig的新手。
我有一个包含多个文件的目录。现在我需要对这些进行字数统计。我可以使用Hadoop示例示例wordcount并在目录上运行它以获取输出,但输出将在单个文件中。如果我想要每个文件的输出应该在不同的文件中,我该怎么办?
我也可以用猪。并将目录作为猪的输入。但是,如何读取目录中的文件名,然后将其提供给LOAD?
我的意思是:
假设我有一个目录Test,它有5个文件test1,test2,test3,test4,test5。现在,我希望将每个文件的单词计数分别放在一个单独的文件中。我知道我可以提供个人姓名,但这需要花费很多时间。
我是否有可能从目录中读取文件名并将其作为输入提供给猪的LOAD?
答案 0 :(得分:1)
如果您使用的是Pig版本0.10.0或更高版本,则可以利用source tagging和MultiStorage的组合来跟踪文件。
例如,如果您的输入目录pigin
包含以下文件和内容:
pigin
|-test1 => "hello"
|-test2 => "world"
|-test3 => "Apache"
|-test4 => "Hadoop"
|-test5 => "Pig"
以下脚本将读取每个脚本并将每个文件的内容写入不同的目录。
%declare inputPath 'pigin'
%declare outputPath 'pigout'
-- Define MultiStorage to write output to different directories based on the
-- first element in the tuple
define MultiStorage org.apache.pig.piggybank.storage.MultiStorage('$outputPath','0');
-- Load the input files, prepending each tuple with the file name
A = load '$inputPath' using PigStorage(',', '-tagsource');
-- Write output to different directories
store A into '$outputPath' using MultiStorage();
上面的脚本将创建一个如下所示的输出目录树:
pigout
|-test1
| `-test1-0 => "test1 hello"
|-test2
| `-test2-0 => "test2 world"
|-test3
| `-test3-0 => "test3 Apache"
|-test4
| `-test4-0 => "test4 Hadoop"
|-test5
| `-test5-0 => "test5 Pig"
文件名末尾的-0
对应于生成输出的reducer。如果您有多个reducer,则每个目录可能会看到多个文件。
答案 1 :(得分:0)
您可以扩展PigStorage代码以将文件名添加到元组,请参阅Code Sample查找问题“问:我从包含不同文件的目录中加载数据。如何找出数据的来源从?”。对于输出,您可以对PigStorage执行类似的扩展,以写入不同的输出文件。