更改元组字段的顺序

mwyxok5s  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(229)

例如,假设我将两个不同的文件加载到一个pig脚本中

A = LOAD 'file1' USING PigStorage('\t') AS (
    day:chararray,
    month:chararray,
    year:chararray,
    message:chararray);

B = LOAD 'file2' USING PigStorage('\t) AS (
    month:chararray,
    day:chararray,
    year:chararry,
    message:chararray);

现在,注意字段的顺序是不同的,所以如果我将它们合并到一个文件中 C = UNION A, B; 我得到。。。

(2,OCT,2013,INFO INVALID USERNAME)
(OCT,3,2013,WARN STACK OVERFLOW)

如果为了使数据更容易读取,我想对字段重新排序,以便它们都遵循一种通用格式,并且每个字段都有相同的位置符号。

(2,OCT,2013,INFO INVALID USERNAME)
(3,OCT,2013,WARN STACK OVERFLOW)

这也出现在其他一些地方的消息,水平,主机等。它不仅是日期字段,我想让一切“漂亮”的周围。
在一些奇怪的伪代码中,我会寻找这样的东西:

D = FOREACH B
    REORDER (month,day,year) TO (day,month,year);

我还没有找到任何人尝试这样做的例子,也没有看到一个函数可以做到这一点。所以也许这是不可能的,我一个人在这里,但如果有人有任何想法,我会感激一些提示。

yxyvkwin

yxyvkwin1#

一般来说,这在pig中是不必要的,因为您只需按名称引用字段,而不必担心它们在记录中的位置。如果你的目标是 UNION 在这两种关系中,可以使用 ONSCHEMA 关键字:

C = UNION ONSCHEMA A, B;

也就是说,如果你真的需要重新排序一个关系,一个简单的 FOREACH...GENERATE 您只需要:

D = FOREACH B GENERATE day, month, year, message;

请注意,在您的示例中,您实际上并没有处理元组,而是处理整个记录。如果你有一个元组,你可以使用 TOTUPLE 内置的自定义项,可满足您的需求:

DESCRIBE E;
E: {t: (month: chararray,day: chararray,year: chararray,message: chararray)}

F = FOREACH E GENERATE TOTUPLE(t.day, t.month, t.year, t.message) AS t;
DESCRIBE F;
F: {t: (day: chararray,month: chararray,year: chararray,message: chararray)}

相关问题