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:查找两个数据框的交集仅返回一列具有值的主要内容,如果未能解决你的问题,请参考以下文章

pyspark:在数据框的每一列中获取唯一项目

如何根据 PySpark 数据框的另一列中的值修改列? F.当边缘情况

pyspark 中的 UDF 能否返回与列不同的对象?

使用pyspark查找每个对应列的两个数据帧上的值差异

json的Pyspark问题具有字符串和数组值的字段

Pyspark:数据框的字典列表