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