pyspark:多个数据帧的交集

时间:2017-02-04 17:07:10

标签: python apache-spark pyspark spark-dataframe pyspark-sql

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

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

例如:0001100R1次访问R1网站。 特别是,我只有30个可能的站点,并且有25k个用户。到目前为止,据我所知,我的数据帧的行是不可预测的,但肯定超过2百万。

我想计算每两个网站(在这种情况下:R2 vs R1R3 vs R1R4 vs {{ 1}},R2 vs R3R2 vs R4等等)他们共同拥有的用户总访问量之和。

例如:

  • 为这对情侣R1R2我有两个共同的用户:R100010002R2有{{} 1}}和0001,因此交集为00020001,最后总访问次数为0002
  • 为情侣100+50=150R1我没有共同的用户,因此总数为R3

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

  1. 迭代所有可能的通道0c1
  2. c2c1
  3. 过滤
  4. 与两个已过滤的数据框的c2相交,并将相对id数字相加
  5. 有没有想过更好地解决这个问题?

1 个答案:

答案 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|
+----+----+-----+