使用同一个pig脚本存储多个文件

qcbq4gxm  于 2021-05-30  发布在  Hadoop
关注(0)|答案(3)|浏览(337)

文件包含数据:

A 12345
B 32122
C 23232

只运行一次pig脚本并先存储的选项是什么 record(A 12345) 在一个文件中, second record(B 32122) 在第二个文件中 third(c 23232) 在第三个文件中。现在,如果我们运行pig脚本,它将为每个存储运行作业。请告诉我选项。

r6l8ljro

r6l8ljro1#

其实Pig不是为这个而生的。但是如果你想这样做的话,就必须编写一个自定义的存储函数。必须编写一些扩展storefunc类的类。更进一步说,它将不得不使用多个输出,因为你想存储在3个不同的文件。
参考https://pig.apache.org/docs/r0.7.0/udf.html#store+自定义存储函数的函数。
否则,在pig中,一个store命令将只存储一个别名,只存储在一个文件中。
对于这种需求,最好编写javamr。

jpfvwuh4

jpfvwuh42#

您可以尝试使用multistorage()选项,它将在piggybank jar中提供。您需要下载pig-0.11.1.jar并将其设置在类路径中。
例子:
输入文件

A 12345
B 32122
C 23232

Pig手稿:

A = LOAD 'input.txt' USING PigStorage(' ') AS (f1,f2);
STORE A INTO 'output' USING org.apache.pig.piggybank.storage.MultiStorage('output', '0');

现在输出文件夹包含3个dir a、b、c,文件名(a-0000、b-0000和c-0000)包含实际值
输出$ls

A       B       C       _SUCCESS

输出$cat a/a-0000

A   12345

输出$cat b/b-0000

B   32122

输出$cat c/c-0000

C   23232
svmlkihl

svmlkihl3#

使用split操作符根据某个表达式将关系的内容划分为两个或多个关系。根据表达式中所述的条件:

A tuple may be assigned to more than one relation.

A tuple may not be assigned to any relation.

例子
在本例中,关系a被分为三个关系x、y和z。

A = LOAD 'data' AS (f1:int,f2:int,f3:int);

DUMP A;                
(1,2,3)
(4,5,6)
(7,8,9)        

SPLIT A INTO X IF f1<7, Y IF f2==5, Z IF (f3<6 OR f3>6);

DUMP X;
(1,2,3)
(4,5,6)

DUMP Y;
(4,5,6)

DUMP Z;
(1,2,3)
(7,8,9)

然后根据文件名存储x,y,z
我的目标是读取一个文件,并根据它适合您的问题的标准将记录写入不同的文件。

相关问题