【问题标题】:Filtering and Grouping tuples on several fields in Pig Latin在 Pig Latin 中的几个字段上过滤和分组元组
【发布时间】:2014-09-04 11:22:04
【问题描述】:

我对在工作中使用 Pig 比较陌生。我有一个巨大的表格(367 万个条目),其中包含字段 - id、feat1:value、feat2:value ... featN:value。其中 id 是文本,feat_i 是特征名称,value 是给定 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

谢谢

【问题讨论】:

  • 在你的例子中,id2和id3在哪里有共同的特征?
  • 对不起,你是对的,我刚刚更正了答案。
  • PIG 中没有可以跨行工作的操作。在这种情况下,JOIN 或 CROSS 是不可避免的。其他解决方案是使用 UDF 并将所有数据作为单行传递给 UDF。同样在 UDF 中,您最终会执行 JOIN(对数据进行 2 次循环),因此我看不到使用 UDF 的任何性能改进。 IMO,包含 360 万行的关系的 SelfJoin 对于 Hadoop 来说并没有那么大。
  • 我尝试了自我加入,它只是坐在那里,有 1 个减速器。我将尝试使用 PARALLEL 运行它。在 Map-Reduce 上执行此操作会更好,因为我花了两天时间来执行此操作,集群有 12 个节点,内存足够,但仍然没有得到余弦相似度!

标签: join hadoop mapreduce apache-pig


【解决方案1】:

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

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

【讨论】:

  • 有没有办法计算所有这些行之间的成对相似度。再次使用 CROSS 会爆炸数据的大小 (3.6 * 3.6 Mil)。我只需要 id1、id2 和 id1、id3 和 id2、id3 之间的成对相似性。我认为通过通用特征对其进行过滤将使 N^2 问题易于管理。
【解决方案2】:

我会尝试不解析字符串。 如果可能,将数据读取为两列: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*(特征数量)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多