Pig使用元组字段加载文件

时间:2014-09-25 17:38:52

标签: hadoop mapreduce apache-pig

我需要以下用例的帮助:

最初我们加载一些文件并处理这些记录(或更多技术上的元组)。经过这个处理,最后我们得到了形式的元组:

(some_field_1, hdfs://localhost:9000/user/kailashgupta/data/1/part-r-00000, some_field_3)
(some_field_1, hdfs://localhost:9000/user/kailashgupta/data/2/part-r-00000, some_field_3)
(some_field_1, hdfs://localhost:9000/user/kailashgupta/data/1/part-r-00001, some_field_3)

所以基本上,元组有文件路径作为其字段的值(我们显然可以将这个元组只有一个字段,文件路径为值OR)转换为单个元组,只有一个字段有一些分隔符(比如逗号)分隔字符串)。

所以现在我必须在Pig脚本中加载这些文件,但我无法这样做。你能否建议如何继续前进。我想过使用高级foreach运算符并尝试如下:

data = foreach tuples_with_file_info {
    fileData = load $2 using PigStorage(',');
    ....
    ....
};

然而它不起作用。

修改 为简单起见假设,我有一个单元组,其中一个字段具有文件名:

(hdfs://localhost:9000/user/kailashgupta/data/1/part-r-00000)

2 个答案:

答案 0 :(得分:0)

您不能使用开箱即用的Pig来做到这一点。

我要做的是使用其他一些脚本语言(bash,Python,Ruby ...)从hdfs读取文件并将文件连接成一个字符串,然后可以将其作为参数推送到Pig脚本在LOAD语句中使用。 Pig支持通配,因此您可以执行以下操作:

a = LOAD '{hdfs://localhost:9000/user/kailashgupta/data/1/part-r-00000,hdfs://localhost:9000/user/kailashgupta/data/2/part-r-00000}' ...

所以剩下要做的就是读取包含这些文件名的文件,将它们连接成一个glob,如:

{hdfs://localhost:9000/user/kailashgupta/data/1/part-r-00000,hdfs://localhost:9000/user/kailashgupta/data/2/part-r-00000}

并将其作为参数传递给Pig,因此您的脚本将以:

开头
a = LOAD '$input'

你的猪叫声如下:

pig -f script.pig -param input={hdfs://localhost:9000/user/kailashgupta/data/1/part-r-00000,hdfs://localhost:9000/user/kailashgupta/data/2/part-r-00000}

答案 1 :(得分:0)

首先,将tuples_with_file_info存储到某个文件中:

STORE tuples_with_file_info INTO 'some_temporary_file';

然后,

data = LOAD 'some_temporary_file' using MyCustomLoader();

,其中 MyCustomLoader只是一个Pig加载程序LoadFuncMyInputFormat使用InputFormat作为MyInputFormat

TextInputFormat是对实际InputFormat(例如MyInputFormat)的封装,它必须用于从文件中读取实际数据(例如,在我的情况下,从文件hdfs:// localhost:9000 /用户/ kailashgupta /数据/ 1 /部分-R-00000)。

getSplits中,覆盖some_temporary_file方法;首先从Configuration读取实际文件名(您必须从mapred.input.dir' s Configuration属性获取此文件名),然后更新相同的{{1带有检索文件名的mapred.input.dir,然后从包装的InputFormat返回结果(例如在我的情况下TextInputFormat)。

注意: 1.您无法使用setLocation(或其他类似API)中的LoadFunc API来阅读some_temporary_file的内容,因为其内容仅在运行时可用。 2.在你的脑海中可能会出现一个疑问,如果LOAD语句在STORE之前执行了怎么办?但这不会发生,因为如果STORELOAD在脚本中使用相同的文件,Pig可确保以正确的顺序执行作业。有关详细信息,请参阅Pig Wiki

上的存储加载序列部分