Apache Spark Streaming-reduceByKey,groupByKey,aggregateByKey或CombineByKey?

时间:2019-02-22 07:29:36

标签: apache-spark spark-streaming

我有一个应用程序,该应用程序会在10分钟的时间段内生成多个会话,每个会话包含多个事件(以Avro格式)-每个事件将包含一个会话ID,该ID可用于查找所有会话数据。收集完所有这些数据后,我想创建一个会话对象。

我的计划是在Spark Streaming中使用一个窗口,以确保内存中有可用的数据可进行处理-除非有任何其他建议可以很好地解决我的问题。

阅读Apache Spark文档后,看来我可以使用各种不同的API来实现这一目标,但是我正在努力找出最适合我的问题的API-到目前为止,我遇到了reduceByKey / groupByKey / gregationByKey / CombineByKey。

为了让您更详细地了解会话/事件数据,我希望活动会话数在1m左右,并且每个会话在10分钟内产生5/10个事件。

最好输入一些方法,使其适合于收集所有会话事件并生成单个会话对象。

谢谢。

1 个答案:

答案 0 :(得分:-1)

@phillip感谢您提供详细信息。让我们进入每个键的详细信息:

(1)。 groupByKey-它可以帮助您使用任何键进行排名,排序甚至汇总。在性能方面,它比较慢,因为不使用合并器。 groupByKey()只是根据密钥对数据集进行分组

如果您要进行总计,计数,最小值,最大值之类的汇总,则不建议这样做。

(2)。 reduceBykey-仅支持求和,混合,最大值等聚合。使用组合器的速度比groupbykey快。洗牌的数据很少。 reduceByKey()类似于分组+聚合。 当我们在大型数据集上运行时,可以使用reduceByKey。

(3)。 aggregateByKey-与reduceBykey类似,它仅支持诸如sum,mix,max的聚合。在逻辑上与reduceByKey()相同,但是它允许您以不同类型返回结果。换句话说,它使您可以将输入作为x类型并将聚合结果作为y类型。例如,以(1,2),(1,4)作为输入,以(1,“ six”)作为输出

我相信您只需要分组而无需聚合,那么我相信您别无选择,只能使用groupBykey()