pig使用tuple字段加载文件

izkcnapc  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(337)

我需要以下用例的帮助:
最初我们加载一些文件并处理这些记录(或者更严格地说是元组)。经过这个处理,最后我们得到了如下形式的元组:

(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)

所以基本上,元组有文件路径作为其字段的值(我们可以很明显地将只有一个字段有文件路径作为值的元组转换为只有一个字段有分隔符(比如逗号)分隔字符串的元组)。
所以现在我必须用pig脚本加载这些文件,但是我不能这样做。你能建议下一步怎么做吗。我想用高级的 foreach 操作员并尝试如下:

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

但是它不起作用。
编辑:为简单起见,假设我有一个元组,其中一个字段有文件名:

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

os8fio9y1#

你不能用“开箱即用”来做这件事。
我要做的是使用其他一些脚本语言(bash、python、ruby…)从hdfs读取文件,并将这些文件连接成一个字符串,然后将其作为参数推送到pig脚本中,以便在load语句中使用。pig支持globbing,因此您可以执行以下操作:

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叫声是这样的:

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}
qfe3c7zg

qfe3c7zg2#

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

STORE tuples_with_file_info INTO 'some_temporary_file';

那么,

data = LOAD 'some_temporary_file' using MyCustomLoader();

哪里 MyCustomLoader 只不过是一个 Pig 装载机伸出 LoadFunc ,使用 MyInputFormat 作为 InputFormat . MyInputFormat 是对实际输入格式的封装(例如。 TextInputFormat )它必须用于从文件中读取实际数据(例如,在我的情况下,从文件hdfs://localhost:9000/user/kailashgupta/data/1/part-r-00000)。
MyInputFormat ,覆盖 getSplits 方法;首先从 some_temporary_file (您必须从 Configurationmapred.input.dir 属性),然后更新相同的
Configuration mapred.input.dir 使用检索到的文件名,然后从 Package 的inputformat返回结果(例如,在我的例子中 TextInputFormat ).
注:1。您不能使用 setLocation api来自 LoadFunc (或其他类似的api)读取 some_temporary_file ,因为其内容仅在运行时可用。2你心里可能会产生一个疑问,如果 LOAD 语句在 STORE ? 但这不会发生因为如果 STORE 以及 LOAD 在脚本中使用相同的文件, Pig 确保作业按正确的顺序执行。有关更多详细信息,请参阅pig wiki上的store load sequences一节

相关问题