猪:FLATTEN关键字

use*_*944 3 hadoop mapreduce apache-pig bigdata

FLATTEN对PIG 中关键字的使用感到困惑.

考虑以下数据集:

tuple_record: {details: (firstname: chararray,lastname: chararray,age: int,sex: chararray)}
Run Code Online (Sandbox Code Playgroud)

不使用FLATTEN我可以访问一个字段(假设名字),如下所示:

display_firstname = FOREACH tuple_record GENERATE details.firstname;
Run Code Online (Sandbox Code Playgroud)

现在,使用FLATTEN关键字:

flatten_record = FOREACH tuple_record GENERATE FLATTEN(details);
Run Code Online (Sandbox Code Playgroud)

DESCRIBE 给我这个:

flatten_record: {details::firstname: chararray,details::lastname: chararray,details::age: int,details::sex: chararray}
Run Code Online (Sandbox Code Playgroud)

因此,我可以直接访问存在的字段,而不是dereferencing这样:

display_record = FOREACH flatten_record GENERATE firstname;
Run Code Online (Sandbox Code Playgroud)

我与此FLATTEN关键字相关的问题是:

1)两者之间的哪种方式(即使用或不使用FLATTEN)是实现相同输出的优化方式?

2)任何不使用FLATTEN关键字的特殊情况,都无法实现所需的输出?

完全糊涂; 请澄清其用途,以及我将使用它的所有场景.

Pra*_*ode 5

  1. 有时您在包或元组中有数据,并且您想要删除该级别的嵌套.
  2. 当您想要动态切换数据并按特定字段分组时,您需要一种方法将这些条目从包中取出.

根据Pig文档:

FLATTEN运算符在语法上看起来像UDF,但它实际上是一个运算符,它以UDF不能的方式改变元组和包的结构.扁平化不包括元组和包.这个想法是一样的,但每种结构的操作和结果都不同.

有关详细信息,请查看此链接,他们已通过示例清楚地解释了FLATTEN的用法