0

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

这是初始加载后的脚本:

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/';
4

2 回答 2

2

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

第1步。

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

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

第2步

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

B = group a by $groupvariable

第 3 步

运行如下脚本

pig -paramfile=groupparams.txt pigscript.pig
于 2013-04-09T06:16:15.637 回答
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 会遇到这种问题。

如果不是这种情况,您的原始方式可能会更快,因为除非您必须,否则您绝对不想在 Pig 中使用连接。

于 2013-04-11T00:50:11.413 回答