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 访问该网站的次数。
请注意 - 由于不相关的原因 - 给定某个 id
其 visit
值始终相同(例如 id
0001
始终 100
作为 visit
值)。
例如:ID 0001
访问 100
次 R1
站点。
特别是,我只有 30 个可能的站点和不同的 25k 用户。到目前为止,据我所知,我的数据框的行是不可预测的,但肯定超过 200 万。
我想计算每对网站(在本例中:R1
vs R2
、R1
vs R3
、R1
vs R4
、R2
vs R3
、R2
vs R4
等)他们共同的用户总访问量之和。
例如:
- 情侣
R1
vs R2
我有两个共同用户:R1
有 0001
和 0002
,R2
有0001
和0002
,所以交集是0001
和0002
最后总访问量是100+50=150
.
- 夫妻
R1
vs R3
我没有共同的用户所以总数是 0
我的想法太琐碎太慢了。事实上我会:
- 迭代所有可能的通道对
c1
和 c2
- 过滤
c1
和 c2
- 将两个过滤后的数据帧的
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|
+----+----+-----+
在 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 访问该网站的次数。
请注意 - 由于不相关的原因 - 给定某个 id
其 visit
值始终相同(例如 id
0001
始终 100
作为 visit
值)。
例如:ID 0001
访问 100
次 R1
站点。
特别是,我只有 30 个可能的站点和不同的 25k 用户。到目前为止,据我所知,我的数据框的行是不可预测的,但肯定超过 200 万。
我想计算每对网站(在本例中:R1
vs R2
、R1
vs R3
、R1
vs R4
、R2
vs R3
、R2
vs R4
等)他们共同的用户总访问量之和。
例如:
- 情侣
R1
vsR2
我有两个共同用户:R1
有0001
和0002
,R2
有0001
和0002
,所以交集是0001
和0002
最后总访问量是100+50=150
. - 夫妻
R1
vsR3
我没有共同的用户所以总数是0
我的想法太琐碎太慢了。事实上我会:
- 迭代所有可能的通道对
c1
和c2
- 过滤
c1
和c2
- 将两个过滤后的数据帧的
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|
+----+----+-----+