2017-06-20 79 views
1

問題標題可能太隱含。 比方說,我們有一個火花數據幀:如何計算基於另一列的值數量?

user_ID   phone_number 
-------------------------------- 
A     1234567 
B     1234567 
C     8888888 
D     9999999 
E     1234567 
F     8888888 
G     1234567 

而且我們需要來算,每個USER_ID,多少USER_ID的份額相同PHONE_NUMBER它。對於上市前表,所期望的結果應該是:

user_ID   count_of_userID_who_share_the_same_phone_number 
---------------------------------------------------------------- 
A     4 
B     4 
C     2 
D     1 
E     4 
F     2 
G     4 

它可以通過寫spark.sql(query)自連接查詢來實現,但性能相當心臟破。 任何建議如何獲得更快的實施?謝謝:)

回答

3

用放電的Window功能應該執行比self-join顯著好:

val df = Seq(
    ("A", "1234567"), 
    ("B", "1234567"), 
    ("C", "8888888"), 
    ("D", "9999999"), 
    ("E", "1234567"), 
    ("F", "8888888"), 
    ("G", "1234567") 
).toDF(
    "user_id", "phone_number" 
) 

// Add phone number count via window function 
import org.apache.spark.sql.expressions.Window 
val df2 = df.withColumn("count", count("user_id").over(
    Window.partitionBy("phone_number") 
)).orderBy("user_id") 

df2.show 
+-------+------------+-----+ 
|user_id|phone_number|count| 
+-------+------------+-----+ 
|  A|  1234567| 4| 
|  B|  1234567| 4| 
|  C|  8888888| 2| 
|  D|  9999999| 1| 
|  E|  1234567| 4| 
|  F|  8888888| 2| 
|  G|  1234567| 4| 
+-------+------------+-----+ 
+0

剛試過,遠遠超過簡單的spark.sql查詢更快! thx – XXXShao

+0

很高興它有幫助。 –