我有一个具有这些值的数据帧-商店ID,项目可用与否(0或1)和可用性百分比。
Store ID Item_1_Available Percent Available
100 0 0
200 1 0.2
300 0 0
400 1 0.9
还有一个数据帧,它用于不同的Item和可用性指标。也可能有来自第一个表的商店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做一个相交来获得最终表,这样我就可以找到同时拥有Item 1和Item 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
是否有一种方法可以在两个表上执行连接以获得最终表?
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
|
+--------+----------------+------------------------+----------------+---
---------------------+
为可用列百分比使用不同的名称,以避免在要对该列执行操作时出现列歧义错误。