我对使用Pig进行工作还比较陌生。我有一个巨大的表(367万个条目),其中包含字段--id、feat:value、feat2:value。。。featN:值。其中id为文本,feat_i为功能名称,值是给定id的功能i的值。由于每个元组是稀疏表示,因此特征的数量可能会有所不同。
例如,这是数据中3行的示例
- id1 f1:23 f3:45 f7:67
- id2 f2:12 f3:23 f5:21
- id3 f7:30 f16:8 f23:1
现在的任务是对具有共同功能的查询进行分组。我应该能够得到那些有任何功能重叠的查询集。我试过几种方法CROSS和JOINS造成数据爆炸,reducer陷入困境。我不熟悉GROUP BY命令的条件。
是否有一种方法可以在GROUP BY中编写条件,使其只选择那些具有公共功能的查询
对于上述行,结果将是:
- id1,id2
- 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*(功能数量)。