使用mapPartitions避免使用groupby和count进行混洗

时间:2019-10-01 07:48:23

标签: scala dataframe apache-spark streaming spark-structured-streaming

我有以下数据,需要根据关键点进行分组并根据关键点计数以监视指标。我可以使用groupBy并对该组进行计数,但这涉及一些改组。我们可以不洗牌吗?

ID,TempID,PermanantID
----------

xxx, abcd, 12345

xxx, efg, 1345

xxx, ijk, 1534

xxx, lmn, 13455

xxx, null, 12345

xxx, axg, null

yyy, abcd, 12345

yyy, efg, 1345

yyy, ijk, 1534

zzz, lmn, 13455

zzz, abc, null

输出应为

ID Count1 Count2
----------
XXX 5 5

YYY 3 3

ZZZ 2 1

我可以使用groupBy进行计数并计数

dataframe.groupby("ID").agg(col("TempID").as("Count1"),count(col("PermanantID").as("Count2"))

我们可以使用mapPartition做到吗?

1 个答案:

答案 0 :(得分:1)

这个问题虽然可以理解,但是有缺陷。

mapPartitions不能直接在数据框上使用,而只能在RDD和数据集上使用。

此外,在调用mapPartitions之前需要进行分区和改组吗?否则,结果将不正确。没有提到保证问题中最初的数据顺序。

因此,我将依靠假定的groupBy方法。认为应用程序不需要改组是一种幻觉,而是我们可以减少改组,这是目标。