1

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

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

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

4

1 回答 1

2

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

C = UNION ONSCHEMA A, B;

也就是说,如果您确实需要重新排序关系,那么FOREACH...GENERATE您只需要一个简单的方法:

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

请注意,在您的示例中,您实际上不是在使用元组,而是在使用整个记录。但是,如果您确实有一个元组,您可以使用TOTUPLE内置的 UDF 来获取您需要去的地方:

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)}
于 2013-10-07T16:44:45.223 回答