更改元组字段的顺序

时间:2013-10-07 16:32:02

标签: apache-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);

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

1 个答案:

答案 0 :(得分:1)

一般情况下,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)}