2017-02-04 47 views
0

在pyspark 2.0我有這個數據幀:pyspark:多dataframes的交集

my_df = spark.createDataFrame([{'id': '0001', 'site': 'R1', 'visit': 100}, 
           {'id': '0002', 'site': 'R1', 'visit': 50}, 
           {'id': '0001', 'site': 'R2', 'visit': 100}, 
           {'id': '0002', 'site': 'R2', 'visit': 50}, 
           {'id': '0003', 'site': 'R3', 'visit': 60}, 
           {'id': '0003', 'site': 'R4', 'visit': 60}, 
           {'id': '0004', 'site': 'R3', 'visit': 40}]) 

描述用戶id,的訪問web的site多少次的名字,他/她訪問該網站。

注意 - 不相關的理由 - 給予一定idvisit值始終是相同的(例如id0001始終100visit值)。

因此,例如:身份證0001訪問100R1網站。 特別是,我只有30個可能的網站和25k個不同的用戶。到目前爲止,據我所知,我的數據框的行是不可預知的,但肯定有超過200萬。

我想計算每一對夫婦的網站(在這種情況下:R1 VS R2R1 VS R3R1 VS R4R2 VS R3R2 VS R4等)用戶的總訪問量的總和他們有共同之處。

例如:

  • 爲情侶R1 VS R2我有兩個共同的用戶:R1具有00010002R2具有00010002,所以交點是00010002和最後的總數量的訪問次數是100+50=150
  • 爲新人R1 VS R3我沒有共同的用戶,以便總數爲0

我的想法太瑣碎,太緩慢。事實上,我將:在信道c1的所有不可能性夫婦

  1. 迭代和由c1c2
  2. 濾波器和c2
  3. 相交id S中的兩個濾波dataframes的,總結相對visit

任何想法更好地解決這個問題?

+0

你能描述你的數據?多少條目?有多少用戶?網站? – eliasah

+0

@eliasah 30個不同的網站,25k個不同的用戶和超過200萬行 – enneppi

+0

然後,您可以爲網站編制索引並創建矩陣條目。那麼你將會處理高瘦的矩陣。但回答你的問題仍然可以相當寬泛。 – eliasah

回答

0

不知道您希望作爲總訪問的輸出結果,但轉換爲表(或視圖)可以幫助您根據SQL進行思考。

這是我的嘗試。它不給的150就像在你的例子,但希望這種方法給你一個方法來解決你的問題:

my_df.createOrReplaceTempView("my_t") 

spark.sql(""" 
select t1.site, t2.site, sum(t1.visit + t2.visit) as totalvisits 
from my_t t1 
join my_t t2 on t2.id = t1.id and t1.site < t2.site 
group by t1.site, t2.site 
""").show() 

此輸出:

+----+----+-----+ 
|site|site|total| 
+----+----+-----+ 
| R3| R4| 120| 
| R1| R2| 300| 
+----+----+-----+ 
+0

你爲什麼不確定我到底想要什麼?如果你解釋你的疑惑,我會給你你需要的信息(同時看到我的編輯)。 你的嘗試似乎是一個好方法:但你爲什麼總結t1.visit + t2.visit?這些價值觀總是重合? – enneppi

+0

我的解決方案與arun有一點不同:我只總結t1.visit。 @eliasah您對這個解決方案的正確性和性能有什麼看法? – enneppi

+0

對不起阿倫,但這很不好@尼科拉。這只是一個交叉連接,它不會擴展,也許它甚至不會爲你做這個工作 – eliasah