Dataframe pyspark与2个查找表连接

Dataframe pyspark与2个查找表连接,dataframe,join,pyspark,Dataframe,Join,Pyspark,我在两个查找表中有一个销售数据和产品详细信息 df_产品查找1 ID product description 1 cereal Minipack 2 canola bottle 4 rice bag df_产品查找2 ID product description 6 glass bottle 8 plants hibiscus 10 tree

我在两个查找表中有一个销售数据和产品详细信息

df_产品查找1

ID     product     description
1      cereal      Minipack
2      canola      bottle
4      rice        bag
df_产品查找2

ID     product     description
6      glass       bottle
8      plants      hibiscus
10     tree        banyan
销售部

ID     product     
10     tree        
1      cereal      
4      rice        
8      plants 
预期产出:

ID     product     description
10     tree        banyan
1      cereal      Minipack
4      rice        bag
8      plants      hibiscus
如果查找表1中没有ID,我应该使用查找表1和更高版本的查找表2

查找表1和2的列名不同,不能合并为一个。 tehre是一种检查lookuptable 1中是否有ID的方法,如果没有,则对sales中的每个记录进行联接,然后查找表2吗?谢谢

我只能用一个查找表进行简单的联接

df_final = sales_df.join(df_prod_lookup1 on=['ID'], how='left')

首先使用查找表1左连接,然后使用查找表2左连接。
合并
功能允许您合并
说明
字段

df_prod_lookup1 = df_prod_lookup1.withColumnRenamed("product", "product1").withColumnRenamed("description", "description1")
df_prod_lookup2 = df_prod_lookup2.withColumnRenamed("product", "product2").withColumnRenamed("description", "description2")

from pyspark.sql.functions import coalesce

# Edit based on comments #
sales_df.join(df_prod_lookup1, on=['ID'], how='left')\
        .join(df_prod_lookup2, on=['ID'], how='left')\
        .withColumn('product', coalesce('product1', 'product2'))\
        .withColumn('description', coalesce('description1', 'description2'))\
        .drop('product1', 'product2', 'description1', 'description2').show()

+---+-------+-----------+
| ID|product|description|
+---+-------+-----------+
|  8| plants|   hibiscus|
|  1| cereal|   Minipack|
| 10|   tree|     banyan|
|  4|   rice|        bag|
+---+-------+-----------+

事实上,我不明白为什么要在查找表中重命名产品。我必须首先签入lookuptable 1,然后如果ID不是tehre,我必须签入lookuptable 2,以从查找中获取产品和描述以及其他列。你能解释一下吗?谢谢,这三个表的列名都相同。如果我在不重命名的情况下加入,则生成的数据帧将具有不明确的列名。如果您可以同时在
ID
product
上加入,则只需重命名
description
。但在问题中,您只通过
ID
加入,因此我重命名了其他两列。谢谢@Cena。这意味着,我必须更改列名,但ID应该更改,对吗?谢谢@Cena。但当您加入时,您只删除了“product1”和“product2”?是这样吗?join(df_prod_lookup1,on=['ID'],how='left')。drop('product1')?我想加入ID并从查找中获取产品和描述。是的@Lilly,我正在从查找表中删除
product
字段。我已编辑代码,从查找表中获取
产品
说明
。重命名列可以避免这种名称歧义。