使用元组字段加载文件



我需要以下用例的帮助:

最初,我们加载一些文件并处理这些记录(或者更严格地说是元组)。经过这个处理,我们终于有了形式为的元组

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

您不能使用开箱即用的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}

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

STORE tuples_with_file_info INTO 'some_temporary_file';

然后,

data = LOAD 'some_temporary_file' using MyCustomLoader();

其中MyCustomLoader只是一个扩展LoadFuncPig加载程序,它使用MyInputFormat作为InputFormat

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

MyInputFormat中,覆盖getSplits方法;首先从some_temporary_file读取实际文件名(您必须从Configurationmapred.input.dir属性中获取此文件名),然后用检索到的文件名更新相同的Configuration mapred.input.dir,然后从封装的InputFormat返回结果(例如,在我的案例中为TextInputFormat)。

注意:1。不能使用LoadFunc中的setLocation API(或其他类似的API)来读取some_temporary_file的内容,因为其内容仅在运行时可用。2.您可能会产生一个疑问,如果LOAD语句在STORE之前执行呢?但这不会发生,因为如果STORELOAD在脚本中使用相同的文件,Pig会确保作业按正确的顺序执行。有关更多详细信息,您可以阅读Pig Wiki 上的存储加载序列部分

相关内容

  • 没有找到相关文章

最新更新