[英]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.