簡體   English   中英

在 Spark 上提高 distinct + groupByKey 的性能

[英]Improving performance of distinct + groupByKey on Spark

我正在嘗試學習 spark 並提出了這個問題,但我的解決方案似乎表現不佳。 我希望有人可以教育我如何提高性能。 我遇到的問題如下。

我有幾百萬個元組(例如(A,B),(A,C),(B,C)等),可能有重復的元組(鍵和值)。 我想做的是通過鍵將元組分組並且為了使其更有趣,將分組值的長度限制為任意數字(比如說3)。

因此,例如,如果我有:

[(A, B), (A, C), (A, D), (A, E), (B, C)]

我希望 output 是:

[(A, [B, C, D]), (A, [E]), (B, [C]))

如果列表的任何值超過 3,那么它將拆分它,並且您將多次列出相同的鍵,如上所示 (A, [E])。 希望這是有道理的。

我想出的解決方案是:

val myTuples: Array[(String, String)] = ...
sparkContext.parallelize(myTuples)
            .distinct()             // to delete duplicates
            .groupByKey()           // to group up the tuples by key
            .flatMapValues(values => values.grouped(3)) // split up values in groups of 3
            .repartition(sparkContext.defaultParallelism)
            .collect()

我的解決方案工作正常,但有沒有更有效的方法來做到這一點? 我聽說 groupByKey 效率很低。 任何幫助將不勝感激。

另外,我應該為分區選擇一個好的數字嗎? 我注意到distinct接受一個partition參數,但不確定我應該放什么。

謝謝!

您需要稍微重新制定您的問題,因為您實際上並沒有在這里按單個鍵進行分組; 在你上面的例子中,你 output 多行“A”。 在下面,我添加了一個列,我們可以另外使用它來分組(它將每 3 條記錄遞增),以及作為 Spark SQL function 的 collect_list 來生成您正在尋找的 ZA3CBC3F9D0CE2F2C1554E1D671。 請注意,通過完全堅持使用 Spark SQL,您可以從 Spark 獲得許多優化(通過“催化劑”,它是一個查詢優化器)。

import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window

val data = List(("A", "B"), ("A", "C"), ("A", "D"), ("A", "E"), ("B", "C")).toDF("key","value")

val data2 = data.withColumn("index", floor(
  (row_number().over(Window.partitionBy("key").orderBy("value"))-1)/3)
)
data2.show

+---+-----+-----+
|key|value|index|
+---+-----+-----+
|  B|    C|    0|
|  A|    B|    0|
|  A|    C|    0|
|  A|    D|    0|
|  A|    E|    1|
+---+-----+-----+

data2.groupBy("key","index").agg(collect_list("value")).show

+---+-----+-------------------+
|key|index|collect_list(value)|
+---+-----+-------------------+
|  B|    0|                [C]|
|  A|    0|          [B, C, D]|
|  A|    1|                [E]|
+---+-----+-------------------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM