在pyspark 2.0中我有这个数据框:
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
,访问过的网络的名称 - site
以及他/她访问该网站的次数。
请注意 - 由于不相关的原因 - 给定某个id
其visit
值始终相同(例如id
0001
始终为100
visit
值)。
例如:0001
次100
次R1
次访问R1
网站。
特别是,我只有30个可能的站点,并且有25k个用户。到目前为止,据我所知,我的数据帧的行是不可预测的,但肯定超过2百万。
我想计算每两个网站(在这种情况下:R2
vs R1
,R3
vs R1
,R4
vs {{ 1}},R2
vs R3
,R2
vs R4
等等)他们共同拥有的用户总访问量之和。
例如:
R1
与R2
我有两个共同的用户:R1
有0001
和0002
,R2
有{{} 1}}和0001
,因此交集为0002
和0001
,最后总访问次数为0002
。100+50=150
与R1
我没有共同的用户,因此总数为R3
我的想法太琐碎而且太慢了。事实上我会:
0
和c1
c2
和c1
c2
相交,并将相对id
数字相加有没有想过更好地解决这个问题?
答案 0 :(得分: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|
+----+----+-----+