【问题标题】:pyspark join with 2 lookup tablespyspark 加入 2 个查找表
【发布时间】:2021-02-24 01:35:15
【问题描述】:

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

df_prod_lookup1

ID     product     description
1      cereal      Minipack
2      canola      bottle
4      rice        bag

df_prod_lookup2

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

sales_df

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 的列名不同,不能合并为一个。 是否有一种方法可以检查 ID 在查找表 1 中是否可用,如果没有则进行连接,然后为销售中的每条记录查找表 2?谢谢。

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

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

问候

【问题讨论】:

    标签: dataframe join pyspark


    【解决方案1】:

    左连接首先使用查找表 1,然后使用查找表 2。
    coalesce 函数允许您合并description 字段。

    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|
    +---+-------+-----------+
    

    【讨论】:

    • 其实我不明白你为什么要在查找表中重命名产品。我只需要先检查查找表 1,然后如果 ID 不是 tehre,我必须检查查找表 2 以从查找中获取产品和描述以及其他列。你能解释一下吗?谢谢
    • 您对所有 3 个表都有相同的列名。如果我在不重命名的情况下加入,则生成的数据框将具有 ambiguous 列名。如果您可以同时加入IDproduct,则只需重命名description。但在问题中,您只能通过ID 加入,因此我重命名了其他 2 列。
    • 感谢@Cena。这意味着,我必须更改除 ID 之外的列名,对吗?
    • 感谢@Cena。但是当你加入时你只放弃'product1'和'product2'?这样对吗? join(df_prod_lookup1, on=['ID'], how='left').drop('product1')?我想加入 ID 并从查找中获取产品和描述。
    • 是的@Lilly,我从查找表中删除了product 字段。我编辑了我的代码以从查找表中获取productdescription。重命名列可以避免这种名称歧义。
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多