Pyspark:查找两个数据框的交集仅返回一列具有值
Posted
技术标签:
【中文标题】Pyspark:查找两个数据框的交集仅返回一列具有值【英文标题】:Pyspark: Finding the intersection of two dataframes returns only one column with values 【发布时间】:2021-08-05 05:11:42 【问题描述】:我有一个包含这些值的数据框 - 商店 ID、商品是否可用(0 或 1)以及可用性百分比。
Store ID Item_1_Available Percent Available
100 0 0
200 1 0.2
300 0 0
400 1 0.9
还有一个数据框用于不同的项目和可用性指标。这里可能也有来自第一个表的商店 ID - 同一家商店出售不同的商品
Store ID Item_2_Available Percent Available
400 1 0.8
600 1 0.7
700 0 0
100 1 0.5
我正在尝试获得一张决赛桌(包含以下结构的 50 多个项目)。
Store ID Item_1_Available Percent Available Item_2_Available Percent Available
100 0 0 1 0.5
200 1 0.2 0 0
300 0 0 0 0
400 1 0.9 1 0.8
600 0 0 1 0.7
700 0 0 0 0
我尝试使用 spark 进行相交以获得决赛桌,以便我可以找到同时拥有第 1 项和第 2 项的商店。
from functools import reduce
from pyspark.sql import DataFrame
def intersect(*dfs):
return reduce(DataFrame.intersect, dfs)
final_table = intersect(df1, df2)
但它只返回第一个表中的一列作为输出。
Store ID Item_1_Available
100 1
200 0
300 0
400 1
有没有办法只对两个表进行连接以获得最终表?
【问题讨论】:
根据哪一列比较两个数据框? @Yukeshkumar 应该是根据Store ID来的 您需要的是full_outer
加入Store ID
字段。
@samkart 不,full_outer join 将在最终表中创建重复的列。
然后,在最终数据帧中,您可以使用 dropDuplicates()。
【参考方案1】:
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
storeDF1 = spark.read.csv("store1.txt",header="True")
storeDF2 = spark.read.csv("store2.txt",header="True")
storeDF1.join(storeDF2,on="Store ID",how="full").show(truncate=False)
+--------+----------------+------------------------+----------------+---
---------------------+
|Store ID|Item_1_Available|Percent Available item
1|Item_2_Available|Percent Available item 2|
+--------+----------------+------------------------+----------------+---
---------------------+
|700 |null |null |0 |0
|
|200 | 1 |0.2 |null
|null |
|300 | 0 |0 |null
|null |
|100 | 0 |0 |1 |0.5
|
|600 |null |null |1 |0.7
|
|400 | 1 |0.9 |1 |0.8
|
+--------+----------------+------------------------+----------------+---
---------------------+
如果您想对该列执行操作,则为可用百分比列使用不同的名称以避免列不明确错误。
【讨论】:
我需要显示的不仅仅是常见的商店 ID。最终表格应该包含所有商店 ID 以及其他列,并且当该列中没有值时,值可以为零(就像我在问题中发布的最终表格一样)以上是关于Pyspark:查找两个数据框的交集仅返回一列具有值的主要内容,如果未能解决你的问题,请参考以下文章