pig中复杂数据类型的问题

sdnqo3pr  于 2021-06-25  发布在  Pig
关注(0)|答案(1)|浏览(523)

我对pig编程比较陌生,我在pig中研究简单的数据类型比较多,当我尝试研究复杂的数据类型时,我没有得到合适的例子,对于复杂的数据类型有输入和输出,谁能给我解释复杂的数据类型,特别是用实时的例子详细地Map数据类型,提前谢谢。

vjrehmav

vjrehmav1#

pig有三种复杂类型:Map、元组和包。这些复杂类型可以包含标量类型和其他复杂类型。所以,有可能有一个Map,其中值字段是一个包,它有一个元组,其中一个字段是Map。
Map:Map是以键值对表示的数据元素Map的特征。该键应始终为chararray类型,并可用作访问关联值的索引。Map中的所有值不一定都是同一类型的。
Map常量由方括号定义,方括号中用“#”分隔键和值,用“,”分隔键值对。

['Name'#'John', 'Age'#22]

上面定义了一个带有两个键值对的map常量。请注意,键的类型始终为chararray,而值的类型分别为chararray和int。
为了将文件中的数据作为Map加载,数据的结构应如下所示:

[this#1.9, is#2.5]  
 [my#3.3, vocabulary#4.1]

sample piglatin语句将上述数据样本作为map加载

grunt> mapdata = load 'MapData' as (a:map[float]);  
 grunt> values = foreach mapdata generate a#'this' as value;  
 grunt> value = FILTER values BY value is not null;  
 grunt> dump value

以上语句的输出为:

(1.9)

load语句将构造两个Map,每个Map有两个键值对。注意,我们在load语句中将值的数据类型指定为“float”。我们可以选择不指定值的类型,如下所示:

grunt> mapdata = load 'MapData' as (a:map[]);

在这种情况下,pig假设值的类型是bytearray,并根据piglatin语句处理数据的方式执行隐式类型转换。
在第二条语句中,我们试图检索与“this”关联的值。注意语法

a#'this'

返回1.9。
元组:元组是固定长度、有序的pig数据元素集合。元组包含可能属于不同类型的字段。元组类似于sql中以字段作为列的行。
由于元组是有序的,所以可以通过字段在元组中的位置来引用字段。元组可以(但不是必需)声明描述每个字段的数据类型并提供字段名称的模式。
元组常量使用括号定义元组,用逗号分隔不同的字段。

('John', 25)

上面声明了一个tuple常量,其中包含两个数据类型字段:chararray和int。

grunt> data = load 'StudentData';  
 grunt> finaldata = foreach data generate $0;  
 grunt> dump finaldata

在上面的语句中,数据是一个外部包(下面是对包的解释),它包含从studentdata文件加载的元组。注意,我们没有为元组声明模式(元组中包含的字段的类型/名称)。在这种情况下,元组的模式是未知的。
但是,我们可以通过位置引用元组中的各个字段(0引用元组中的第一个字段)。

grunt> data = load 'StudentData' as (name:chararray, age:int);  
grunt> finaldata = foreach data generate name;  
grunt> dump finaldata

在本例中,我们为元组定义了一个模式。
包:包是元组的无序集合。因为包是无序的,所以我们不能通过它的位置来引用包中的元组。包也不需要声明模式。对于包,schema描述包中的所有元组。
bag常量是用带逗号的大括号来分隔bag中的元组的。

{('John', 25), ('Nathan', 30)}

上面构造了一个包含两个元组的包。
更多信息--http://morebigdata.blogspot.in/2012/09/pignalytics-pigs-eat-anything-reading.html

相关问题