这两种Pig数据类型有什么区别?

时间:2014-07-02 19:07:28

标签: hadoop apache-pig

给出这个例子:

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_7ht.udf.cleanlog_log_7

谢谢

1 个答案:

答案 0 :(得分:3)

您的理解几乎是正确的。问题在于,当你使用DESCRIBE时,Pig实际上并没有明确标记整个记录的大“元组”。

正如你所说,关系是元组包。例如,当您读取文件时,包中包含文件中的所有数据,文件的每一行都是元组。在你的情况下,A是一包元组。包中的每个元组都有一个元素ht.udf.cleanlog_log_5。此元素也是一个元组,包含两个元素ipproperty_id

现在,当你在元组上使用FLATTEN时,它会“促进”该元组的元素成为包含元组的元素。所以B是一包元组。包的每个元组都有两个元素ht.udf.cleanlog_log_7::ipht.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)}

但是这些元组永远不会被命名,永远不会被引用,所以显示它们是没有用的。