在Pig Latin中的几个字段上过滤和分组元组

时间:2014-09-04 11:22:05

标签: join hadoop mapreduce apache-pig

我在使用Pig工作方面相对较新。我有一个巨大的表(3.67 Mil条目),其中包含字段 - id,feat1:value,feat2:value ... featN:value 。其中 id 是文本,feat_i是功能名称,是给定 id 的功能 i 的值。 由于其稀疏表示,每个元组的特征数可能不同。

例如,这是数据

中3行的示例
  1. id1 f1:23 f3:45 f7:67
  2. id2 f2:12 f3:23 f5:21
  3. id3 f7:30 f16:8 f23:1
  4. 现在的任务是对具有共同功能的查询进行分组。我应该能够获得任何功能重叠的查询集。 我尝试过几件事。 CROSS和JOINS 会导致数据爆炸,减速器卡住。我不熟悉调整GROUP BY命令。

    是否有办法在GROUP BY中编写条件,以便仅选择具有共同特征的查询 对于上面的行,结果将是:

    1. id1,id2
    2. id1,id3
    3. 由于

2 个答案:

答案 0 :(得分:0)

我无法想到在猪身上做到这一点的优雅方式。根据某些条件,不可能对b进行分组。

但是,您可以对所有关系进行GROUP GROUP并将其传递给UDF,以便将每条记录与其他记录进行比较。不是很可扩展,并且需要UDF,但它可以完成这项工作。

答案 1 :(得分:0)

我会尝试不解析字符串。 如果可能,请将数据读取为两列:ID列和要素列。

然后我会与功能表交叉加入。它本质上是一个看起来像这样的表:

f1
f2
f3

在Excel中手动创建并将其加载到HDFS上。

然后我会按功能列进行分组,对于每个功能,我会打印所有ID

基本上,就像这样:

features = load ' features.txt' using PigStorage(',') as (feature_number:chararray);

cross_data = cross features, data;

filtered_data = filter cross_data by (data_string_column matches feature_number);

grouped = group filtered_data by feature_number;

然后您可以打印每个功能的所有ID。

唯一的问题是使用Pig存储以外的其他方式读取数据。 但这会将您的交叉连接从3.6M * 3.6M减少到3.6M *(特征数量)。