我有很多非规范化数据,我需要做一些计算。那里有大约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/';
答案 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中使用的东西。