在GROUP BY中计算PIG查询和MySql查询结果的差异

时间:2012-07-20 10:44:30

标签: hadoop apache-pig sqoop

我的PIG查询如下:


emp = LOAD 'hdfs://master:9000/hrms/DimEmployee' AS  (EmployeeID,OrganizationID,EmploymentType);
grouped = group emp by (OrganizationID, EmploymentType);
AggEmploymentType = FOREACH grouped GENERATE group.OrganizationID, group.EmploymentType,COUNT(emp.EmployeeID) as cnt;
DUMP AggEmploymentType;

下面给出了上述猪查询的逐步描述。

  1. 从HDFS文件中加载100097条记录,该文件是制表符分隔的。
  2. 按公司记录分组,EmploymentStatus
  3. 按EmployeeID计算记录。
  4. 转储输出。
  5. 执行上述查询后,猪壳说,成功读取100115条记录。

    在Pig查询成功执行后,我遇到了三个问题:

    1. 为什么猪准备好了比HDFS更多的记录 (100115> 100097)
    2. 为什么会出现警告信息“ACCESSING_NON_EXISTENT_FIELD 27 TIMES”
    3. 当我在MySQL中通过查询运行相同的组时,结果的计数差异为9。
    4. 请尽快解决我的问题。我的猪,hadoop项目取决于你的快速反应。由于上述问题,我在过去5天内被击中

1 个答案:

答案 0 :(得分:0)

我认为您加载额外的记录并且您也正在访问不存在的字段错误并不是巧合。当您加载并且没有足够的列时,会显示不存在的字段错误。例如,如果您看到如下所示的行,则可能会出现错误:hello,world当您需要3列时。

建议:另外需要注意的是COUNT(x)不计算null项。尝试使用COUNT(emp.EmployeeID)替换COUNT_STAR(emp.EmployeeID)COUNT_STAR将空值考虑在内。

建议: Pig在没有字段时会做的一件事就是将空值放入其中。我建议你在GROUP之前添加一个过滤器,删除带有空值的记录(也可能是“坏”记录)。

emp = FILTER emp BY EmployeeID IS NOT NULL AND 
                    OrganizationID IS NOT NULL AND
                    EmploymentType IS NOT NULL;