处理静态列比使用Pig中的分组更好吗?

时间:2013-04-08 22:01:19

标签: hadoop apache-pig

我有很多非规范化数据,我需要做一些计算。那里有大约28列,其中1列是ID列,其中5列是我需要求和的,其余的我只需要报告。因此,对于单个ID,其中22列始终相同。目前我正在对23列进行分组,然后对5进行求和。在我看来,它可能有不必要的开销。有没有更好的方法来处理它?<​​/ p>

这是初始加载后的脚本:

grouped = GROUP inputData BY
(SITE_ID_COL,
 META_ID_COL,
 ITEM_ID_COL,
 SELLER_ID_COL,
 CATEGORY1_COL,
 CATEGORY2_COL,
 TOTAL_WATCH_COL,
 ITEM_TITLE_COL,
 AUCT_TYPE_COL,
 CURRENCY_COL,
 ITEM_PRICE_COL,
 SHIPPING_TYPE_COL,
 SHIPPING_FEE_COL,
 START_DATE_COL,
 TOTAL_QTY_COL,
 QTY_AVAIL_COL,
 STATUS_ID_COL,
 AUCT_DURATION_COL,
 END_DATE_COL,
 LOGIN_ATOL_COL,
 LOGIN_LATEST_COL);

filtered = FOREACH grouped GENERATE
  flatten(group),
  SUM(inputData.IMPRESSION_COL),
  SUM(inputData.CLICK_COL),
  SUM(inputData.BIDCOUNT_COL),
  SUM(inputData.QTY_SOLD_COL),
  SUM(inputData.CK_TRANS_COL),
  SUM(inputData.GMV_COL);

STORE filtered INTO 'output/';

2 个答案:

答案 0 :(得分:2)

另一种可以解决这个问题的方法是, 从文件中获取组变量,以便您的代码看起来干净整洁 如果您想更改组变量,可以轻松更改。

  

第1步。

在文件groupparams.txt中声明如下所示的变量

groupvariables = col1,col2,col3,col4 .....etc
  

第2步

在猪脚本文件中使用上面的变量,如下所示(比如pigscript.pig)

B = group a by $groupvariable
  

第3步

运行如下脚本

pig -paramfile=groupparams.txt pigscript.pig

答案 1 :(得分:1)

因此,这是否更快取决于您的数据集和群集,但您可以尝试仅使用id和5个总和列重新生成数据,然后重新连接到之后的22个“报告”列。类似的东西:

smallerData = FOREACH inputData GENERATE ITEM_ID_COL, IMPRESSION_COL, ...;

reportingData = FOREACH inputData GENERATE ITEM_ID_COL, [OTHER 22 REPORTING COLS];
reportingData1 = DISTINCT reportingData;

grouped = GROUP smallerData BY ITEM_ID_COL;

filtered = FOREACH grouped GENERATE
  flatten(group) AS id,
  SUM(inputData.IMPRESSION_COL),
  SUM(inputData.CLICK_COL),
  SUM(inputData.BIDCOUNT_COL),
  SUM(inputData.QTY_SOLD_COL),
  SUM(inputData.CK_TRANS_COL),
  SUM(inputData.GMV_COL);

joined = JOIN filtered BY id, reportingData1 BY ITEM_ID_COL;

STORE joined INTO 'output/';

如果您的分组集的行数少于输入集,则可能会使事情变得更快。这对于防止你遇到java堆空间问题也有很长的路要走,当你结束非常宽的行(即在群组之后)时,已经知道了猪。

如果情况并非如此,那么你的原始方式可能会更快,因为除非必须,否则连接绝对不是你想要在Pig中使用的东西。