这是一个虚构的示例,试图在我的问题的较难部分获得帮助。假设我有从Kafka流中获取的销售数据:
...
Period: 5, SalesPersonId: 78, Sale: TRUE, Timestamp: ...,
Period: 5, SalesPersonId: 43, Sale: FALSE, Timestamp: ...,
Period: 5, SalesPersonId: 33, Sale: TRUE, Timestamp: ...,
...
每一行代表特定销售员的销售机会(在特定时期内)。
这是周期的工作方式:周期大约持续2-3周。但是,期间不在我的控制范围内;它们到达信息流时已被分配。在两个时段之间的过渡中,我可能仍会从上一或两天的最后一个时段接收数据(例如,日本的销售地点可能仍旧处于旧时段)。 Beam聊天中的某人建议,如果我只在密钥中包含句点并将间隔时间大致设置为2天,则可以在这种情况下使用会话窗口。似乎那样行得通。
我很清楚该如何做:每个时期的销售机会总数,每个时期的每个销售人员的平均销售率等。例如,调用以下查询 A 生成的PCollection :
SELECT
period,
salesPersonId,
COUNT(*) as totalSalesOpportunities,
COUNT(*) FILTER(WHERE sale) as totalSales,
ROUND(COUNT(*) FILTER (WHERE SALE)/COUNT(*),2) as salesRate
FROM stream
GROUP BY period, salesPersonId
我的要求比这还要复杂。假设我们公司有一个假设,那就是在一段时间内拥有更多销售机会的销售人员将有更好的销售率。总的销售机会可能是动力的指示,或者额外的机会使尝试销售该期间所售产品的实践更多。因此,公司希望获得此统计信息:
在此期间(到目前为止),处于90%或更高百分比的销售机会的销售人员的总销售率是多少?百分位10或更低?即
(TOTAL SALES MADE BY PEOPLE WITH 90%+ SALES OPPORTUNITIES)/(TOTAL SALES OPPORTUNITIES BY PEOPLE WITH 90%+ SALES OPPORTUNITIES)
当然,在此期间的第90个百分位数初期,可能只有3个机会。但是,随着时间的流逝,分布将扩展,可能有40个机会。没关系,然后,例如,如果每小时更新一次此统计信息。
据我所知,我需要执行以下操作,将其称为 B :
Rekey A, apply ApproximateQuantiles, feed it back to filter A, reaggregate A.
但是,我不认为可以逐步做到这一点。那么我该如何表达“继续做A,但是每小时B做为批处理操作”?
或者,有没有更好的方法可以用Beam处理这种情况?
答案 0 :(得分:0)
如果我正确理解了您的问题,则需要对两种数据进行两种汇总。
这里要注意的一件事是,您不能使A依赖于B而B依赖于A,因为这会在管道图中产生循环。
您可以从包含原始输入流的PC1开始。
PC2:PC1->执行A'(与A相同)->执行B
PC3:PC1->使用PC2作为侧面输入来执行A。
您可以了解有关侧面输入here
的更多信息