pig拉丁语中多字段元组的连接过滤与分组

von4xj4u  于 2021-05-30  发布在  Hadoop
关注(0)|答案(2)|浏览(244)

我对用Pig来工作还比较陌生。我有一个巨大的表(367万个条目),其中包含字段——id,feat1:value,feat2:value。。。featn:value. 其中,id是文本,feat\ i是特征名称,value是给定id的特征i的值。每个元组的特征数可能不同,因为它是稀疏表示。
例如,这是一个包含3行数据的示例
同上f1:23 f3:45 f7:67
同上f2:12 f3:23 f5:21
同上f7:30 f16:8 f23:1
现在的任务是对具有公共特性的查询进行分组。我应该能够得到那些有任何功能重叠的查询集。我试过几种方法。交叉和连接会造成数据爆炸,而reducer会被卡住。我不熟悉指挥组。
有没有一种方法可以在groupby中编写一个条件,以便它只选择那些具有公共特性的查询。
对于上述行,结果将是:
id1,id2
id1、id3
谢谢

fwzugrvs

fwzugrvs1#

我想不出一个优雅的方法来做这件事。基于某些条件,不可能将b组分为两组。
但是,您可以对所有关系进行分组,并将其传递给一个自定义项,该自定义项将每个记录与每个其他记录进行比较。可扩展性不强,需要一个自定义项,但它可以完成这项工作。

pes8fvy9

pes8fvy92#

我会尽量不解析字符串。如果可能的话,将数据读取为两列:id列和features列。
然后我将交叉连接一个features表。它基本上是一张这样的table:

f1
f2
f3


在excel中手动创建并加载到hdfs中。
然后我将按features列进行分组,并为每个feature打印所有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.6m3.6m减少到3.6m(特性数量)。

相关问题