2017-06-20 6 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)に自己結合クエリを記述することによって達成することができますが、パフォーマンスはかなり心臓破りです。 どのように私ははるかに高速な実装を得ることができますか?感謝:) self-joinよりも有意に優れて実行する必要がありスパークのWindow機能を使用して

答えて

3

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

助けてくれてうれしいです。 –

関連する問題