【问题标题】:Pig Query for validation用于验证的 Pig 查询
【发布时间】:2014-03-03 18:10:33
【问题描述】:

我是 PIG 的新手,正在尝试根据需要转换一些数据。我有两个输入文件。 首先是type.txt

客户 ID 类型 ID
100 100
101 100
102 100
103 103
104 103

现在,相同的 typeId 意味着客户是相同的。这意味着 100、102 和 104 本质上是相同的客户。

我有另一个表 (gender.txt) 存储 CustomerId 和他们各自的性别 (M/F)

CusId 性别
100M
101 万
102楼
103 米
104 百万

现在,此表意味着相同的客户 100、102 和 104(通过第一个表)没有相同的性别。所以,这意味着任何一个表都包含错误的数据
所以,最后我希望我的输出以单个文本文件的形式组合,其中包含错误数据的三列

CustomerId TypeId 性别

100 1 M
102 1楼
104 1 百万

【问题讨论】:

  • 按cusid加入,按cusid typeid分组,统计每组不同性别的数量,过滤掉少于2个的组。剩下的应该是你要找的。​​span>
  • 好吧,我最初是在尝试加载 type.txt。加载 "type.txt" AS (CusId:int, TypeId:int);然后我尝试按 TypeId 对文件进行分组。分组 = 按 (TypeId) 分组数据。现在,之后我得到的输出为 1 {100,102,104) 2 {101} 3{103} 。所以,我很困惑如何过滤并获得问题中提到的输出。
  • 嗨 Fred,感谢 cmets。但是表格很大。大约有 30 亿行。此外,我无法在您提到按 cusId typeid 分组的地方获得您的第二条评论。就像 Join 完成后 groupby cusId、typeId 的输出一样。
  • 3亿不小,但是用猪应该是可以的。当然是从一个样本数据集开始。
  • 无论如何我们可以优化您提到的以下查询吗?另外,我有一个问题,如果我们有很多关系,比如 A、B、C、D ...直到我,性能会不会受到影响。另外,GROUP by 是否引入了新的 reduce 作业

标签: apache-pig


【解决方案1】:

这里有一个解决方案,应该让你继续前进

A = LOAD 'type.txt' USING PigStorage(',') AS (CusId:chararray, TypeId:chararray);
B = LOAD 'gender.txt' USING PigStorage(',') AS (CusId:chararray, Sex:chararray);
C = JOIN A BY CusId, B BY CusId;
D = FOREACH C GENERATE A::CusId AS CusId, A::TypeId AS TypeId, B::Sex AS  Sex;
E = GROUP D BY (TypeId);
F = FOREACH E {X = D.Sex; Y = DISTINCT X; GENERATE D,COUNT(Y) AS numSex;};
G = FOREACH F GENERATE FLATTEN(D), numSex;
H = FILTER G BY numSex > 1;
I = FOREACH H GENERATE CusId, TypeId, Sex;
DUMP I

(102,1,F)
(100,1,M)
(104,1,M)

【讨论】:

  • 您好 Fred,我尝试使用您的解决方案。但是,我看到了一些问题。如果有 10 个客户具有相同的 typeId,即如果有 10 个重复客户,我看到 mapreduce 日志只转储 2 或 3 行。是否有可能将 sametypeId 行转储在不同的地方?但即使这样,如果我转储数据集,按 TypeId 排序,它也会丢失某些行。
  • 首先将 I 存储到某个文件(而不是转储)。您丢失记录的模式是什么?能举个例子吗?
  • 哦,也许我明白了。我认为第二个文件没有第一个文件中的所有 customerId。因此,加入后,只剩下常见的 CustomerId,而不是第一个文件中的所有 customerId。
  • 嗨 Fred,我有另一个查询(对此的扩展)。我无法确定这是否可以用 Pig 完成,或者我需要在这里使用 UDF。在每个 TypeId 的第一个表中,可以有多个 CustomerId,但其中一个 customerId 与 TypeId 相同,这意味着原始客户。该客户的性别将是真实且正确的性别。现在,我想弄清楚有多少其他客户具有不同的性别但相同的 tyeId(即相同的客户)对于相同的 typeId。也就是说,我想为每个 TypeId 计算出这个数据,我已经将 type.txt 修改为完全描述问题。
猜你喜欢
  • 2018-08-07
  • 1970-01-01
  • 2015-12-09
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 2023-03-28
  • 2020-02-28
相关资源
最近更新 更多