给出这个例子:
describe A;
A: {ht.udf.cleanlog_log_5: (ip: chararray,property_id: int)}
我的理解是A是由ht.udf.cleanlog_log_5
类型的元组组成的包。
(对吗?)
当我应用此转换时:
B = FOREACH A GENERATE FLATTEN($0);
describe B;
B: {ht.udf.cleanlog_log_7::ip: chararray,ht.udf.cleanlog_log_7::property_id: int}
B是什么?
它是一个带有未命名元组的包吗?
每个元组有两个命名字段? (即ht.udf.cleanlog_log_7
和ht.udf.cleanlog_log_7
)
谢谢
答案 0 :(得分:3)
您的理解几乎是正确的。问题在于,当你使用DESCRIBE
时,Pig实际上并没有明确标记整个记录的大“元组”。
正如你所说,关系是元组包。例如,当您读取文件时,包中包含文件中的所有数据,文件的每一行都是元组。在你的情况下,A
是一包元组。包中的每个元组都有一个元素ht.udf.cleanlog_log_5
。此元素也是一个元组,包含两个元素ip
和property_id
。
现在,当你在元组上使用FLATTEN
时,它会“促进”该元组的元素成为包含元组的元素。所以B
是一包元组。包的每个元组都有两个元素ht.udf.cleanlog_log_7::ip
和ht.udf.cleanlog_log_7::property_id
。
DESCRIBE
关系模式的更正确方法是显示这个元组,比如
describe A;
A: {(ht.udf.cleanlog_log_5: (ip: chararray,property_id: int))}
describe B;
B: {(ht.udf.cleanlog_log_7::ip: chararray,ht.udf.cleanlog_log_7::property_id: int)}
但是这些元组永远不会被命名,永远不会被引用,所以显示它们是没有用的。