Pig拉丁语中几个字段上的元组的筛选和分组



我对使用Pig进行工作还比较陌生。我有一个巨大的表(367万个条目),其中包含字段--id、feat:value、feat2:value。。。featN:值。其中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

现在的任务是对具有共同功能的查询进行分组。我应该能够得到那些有任何功能重叠的查询集。我试过几种方法CROSS和JOINS造成数据爆炸,reducer陷入困境。我不熟悉GROUP BY命令的条件。

是否有一种方法可以在GROUP BY中编写条件,使其只选择那些具有公共功能的查询
对于上述行,结果将是:

  1. id1,id2
  2. id1,id3

感谢

我想不出在pig中有什么优雅的方法可以做到这一点。基于某种条件,不可能将b分组。

但是,您可以对所有关系进行分组,并将其传递给一个UDF,该UDF将每条记录与其他每条记录进行比较。不太可扩展,需要一个UDF,但它可以完成任务。

我会尽量不解析字符串。如果可能的话,将数据读取为两列:ID列和要素列。

然后我会交叉连接一个功能表。它本质上是一张这样的表格:

f1
f2
f3

etc

在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*(功能数量)。

相关内容

  • 没有找到相关文章

最新更新