0

我是 Hadoop/Pig 的新手。

我有一个包含多个文件的目录。现在我需要对这些进行字数统计。我可以使用 Hadoop 示例示例 wordcount 并在目录上运行它以获取输出,但输出将在单个文件中。如果我希望每个文件的输出都在不同的文件中,我该怎么办?我也可以用猪。并将目录作为 pig 的输入。但是如何读取目录中的文件名,然后将其提供给 LOAD?我的意思是:
假设我有一个目录 Test ,其中有 5 个文件 test1、test2、test3、test4、test5。现在我想将每个文件的字数分别放在一个单独的文件中。我知道我可以提供个人姓名并这样做,但这需要很多时间。我是否可以从目录中读取文件名并将它们作为输入提供给猪的 LOAD?

4

2 回答 2

1

如果您使用的是 Pig 版本 0.10.0 或更高版本,则可以利用源标记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,你可能会在每个目录中看到多个文件。

于 2012-07-28T01:34:03.090 回答
0

您可以扩展 PigStorage 代码以将文件名添加到元组,请参阅代码示例查找问题“问:我从包含不同文件的目录加载数据。如何找出数据来自哪里?”。对于输出,您可以对 PigStorage 进行类似的扩展以写入不同的输出文件。

于 2012-07-12T10:26:42.743 回答