猪中复杂数据类型的问题

时间:2014-11-21 06:20:00

标签: apache-pig

我是猪编程的新手,我更喜欢猪的简单数据类型,当我尝试研究复杂的数据类型时,我没有得到适当的例子,对于复杂数据类型的输入和输出,任何人都可以解释我复杂的数据类型,特别是使用实时示例详细地映射数据类型,在此先感谢。

1 个答案:

答案 0 :(得分:2)

Pig有三种复杂类型:地图,元组和包。这些复杂类型可以包含标量类型和其他复杂类型。因此,可以有一个地图,其中value字段是一个包含元组的包,其中一个字段是地图。

地图:地图是数据元素映射的标题,以键值对表示。密钥应始终为chararray类型,并可用作访问关联值的索引。地图中的所有值都不必具有相同的类型。

地图常量由方括号定义,“#”将值与值分开,“,”分隔键值对。

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

以上定义了具有两个键值对的映射常量。请注意,键始终是chararray类型,而值分别采用类型chararray和int。

为了将文件中的数据作为地图加载,数据的结构应如下所示:

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

示例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语句将构造两个映射,每个映射具有两个键值对。请注意,我们在load语句中将值的数据类型指定为'float'。我们可以选择不指定值的类型,如下所示:

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

在这种情况下,Pig假定值的类型为bytearray,并根据PigLatin语句处理数据的方式执行隐式转换为适当的类型。

在第二个语句中,我们试图检索与'this'相关联的值。请注意语法

a#'this'

将返回1.9。

元组:元组是固定长度,有序的Pig数据元素集合。元组包含可能具有不同Pig类型的字段。元组类似于Sql中的一行,字段为列。

由于元组是有序的,因此可以通过它在元组中的位置来引用字段。元组可以,但不需要声明描述每个字段的数据类型的模式,并为字段提供名称。

元组常量使用括号来定义元组和逗号以分隔不同的字段。

 ('John', 25) 

上面声明了一个元组常量,它有两个数据类型字段,分别是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 

在这种情况下,我们已经为元组定义了一个模式。

:包是无序的元组集合。由于行李是无序的,我们不能通过其位置参考包中的元组。包也不需要声明架构。如果是bag,schema会描述包中的所有元组。

袋子常数是用大括号构造的,用逗号分隔袋子里的元组。

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

以上构造了一个带有两个元组的包。

了解更多信息 - http://morebigdata.blogspot.in/2012/09/pignalytics-pigs-eat-anything-reading.html