我对 Cascading 和 Hadoop 都很陌生,所以要温柔... :-D
我想我发现自己过度设计了一些东西。基本上我的情况是我有一个带有 9 个字段的管道分隔文件。我想使用不同的分组计算这 9 个字段的一些汇总统计信息。结果应该是 10 个字段,其中只有 6 个是计数或总和。到目前为止,我最多有 4 个 Unique 管道、4 个 CountBy 管道、1 个 SumBy、1 个 GroupBy、1 个 Every、2 Each、5 个 CoGroups 和其他几个。我需要添加另一个小功能,我能看到的唯一方法是添加 2 个过滤器、2 个额外的 CoGroups 和 2 个额外的管道。这一切似乎只是为了计算一些汇总统计数据而过大。所以我想我真的误解了一些东西。
我的输入文件如下所示:
storeID | invoiceID | groupID | customerID | transaction date | quantity | price | item type | customer type
对于库存、服务或组项目,项目类型为“I”、“S”或“G”,客户属于组。其余的应该是不言自明的
我想要的结果是:
project ID | storeID | year | month | unique invoices | unique groups | unique customers | customer visits | inventory type sales | service type sales |
项目ID是一个常数,客户访问是客户在一个月中进来买东西的天数
我现在使用的设置使用 TextDelimited Tap 作为我的源来读取文件并将记录传递到每个管道,该管道使用 DateParser 来解析交易日期并添加年、月和日字段。到目前为止,一切都很好。这就是它失控的地方。
我将流从那里分成 5 个单独的流来处理我想要的每个聚合字段。然后我将所有结果连接到 5 个 CoGroup 管道中,通过 Insert 发送结果(插入项目 ID)并通过 TextDelimited sink Tap 写入。
有没有比这样分成 5 个流更简单的方法?前四个流在不同的字段上做几乎完全相同的事情。例如,第一个流使用 Unique 管道来获取唯一的 invoiceID,然后使用 CountBy 计算具有相同 storeID、年份和月份的记录数。这给了我按年和月为每个商店创建的唯一发票的数量。然后有一个流对 groupID 做同样的事情,另一个对 customerID 做同样的事情。
有什么简化这个的想法吗?必须有更简单的方法。