pyspark:多个数据帧的交集

pyspark: intersection of multiple dataframes

在 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 以及 he/she 访问该网站的次数。

请注意 - 由于不相关的原因 - 给定某个 idvisit 值始终相同(例如 id 0001 始终 100 作为 visit 值)。

例如:ID 0001 访问 100R1 站点。 特别是,我只有 30 个可能的站点和不同的 25k 用户。到目前为止,据我所知,我的数据框的行是不可预测的,但肯定超过 200 万。

我想计算每对网站(在本例中:R1 vs R2R1 vs R3R1 vs R4R2 vs R3R2 vs R4等)他们共同的用户总访问量之和。

例如:

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

  1. 迭代所有可能的通道对 c1c2
  2. 过滤 c1c2
  3. 将两个过滤后的数据帧的 id 相交并对相对的 visit 数求和

有什么办法可以更好地解决这个问题吗?

不确定您到底想要什么作为总访问量的输出,但转换为 table(或视图)可以帮助思考 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|
+----+----+-----+