pyspark:多个数据帧的交集



在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值总是相同的(例如,id0001总是100作为visit值)。

例如:id0001访问100的次数是R1站点的次数。特别是,我只有30个可能的网站,有25000个不同的用户。到目前为止,据我所知,我的数据帧中的行是不可预测的,但肯定超过了200万。

我想为每两个网站(在这种情况下:R1R2R1R3R1R4R2R3R2R4等等)计算他们共同用户的总访问量之和。

例如:

  • 对于R1R2这对夫妇,我有两个共同的用户:R100010002R200010002,所以交集是00010002,最后访问总数是100+50=150
  • 对于R1R3这对夫妇,我没有共同的用户,所以总数是0

我的想法太琐碎,太慢了。事实上我会:

  1. 迭代通道c1c2的所有可能的对
  2. c1c2过滤
  3. 将两个过滤后的数据帧的ids相交,并将相对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|
+----+----+-----+

相关内容

  • 没有找到相关文章

最新更新