在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
值)。
例如:id0001
访问100
的次数是R1
站点的次数。特别是,我只有30个可能的网站,有25000个不同的用户。到目前为止,据我所知,我的数据帧中的行是不可预测的,但肯定超过了200万。
我想为每两个网站(在这种情况下:R1
与R2
、R1
与R3
、R1
与R4
、R2
与R3
、R2
与R4
等等)计算他们共同用户的总访问量之和。
例如:
- 对于
R1
和R2
这对夫妇,我有两个共同的用户:R1
有0001
和0002
,R2
有0001
和0002
,所以交集是0001
和0002
,最后访问总数是100+50=150
- 对于
R1
和R3
这对夫妇,我没有共同的用户,所以总数是0
我的想法太琐碎,太慢了。事实上我会:
- 迭代通道
c1
和c2
的所有可能的对 c1
和c2
过滤- 将两个过滤后的数据帧的
id
s相交,并将相对visit
数相加
有更好地解决这个问题的想法吗?
不确定您到底想要什么作为总访问量的输出,但转换为表(或视图)可以帮助您从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|
+----+----+-----+