举个例子,假设我将两个不同的文件加载到猪脚本中
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);
我无法找到任何人尝试这样做的例子,也没有找到能够做到这一点的功能。所以也许这是不可能的,我一个人在这里,但如果有人有任何想法我会欣赏一些提示。
答案 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)}