2017-02-04 42 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