【问题标题】:How to join 2 data frame based on complex conditions如何根据复杂条件加入2个数据框
【发布时间】:2019-07-27 17:59:18
【问题描述】:

我有 2 个数据框:

一个:

+----------+------+-------------+-------------+
|title     |name  |product      |available    |
+----------+------+-------------+-------------+
|AAAAA     |WW    |indoor camera|true         |
|A121AA    |AA    |indoor camera|true         |
|AACCCA    |YY    |indoor camera|true         |
+----------+------+-------------+-------------+

乙:

+-------------+----------+-------------------+
| product     | title    | name              |
+-------------+----------+-------------------+
|indoor camera|FFFFF     |WW                 |
|indoor camera|F1FFF     |WW                 |
|indoor camera|FYFFF     |YY                 |
|indoor camera|BBB       |MNMN               |
|indoor camera|CCC       |MNMN               |
|indoor camera|DDD       |BBBNNN             |
+-------------+----------+-------------------+

我需要得到一个看起来像这样的连接数据:

+----------+------+-------------+-------------+
|title     |name  |product      |available    |
+----------+------+-------------+-------------+
|AAAAA     |WW    |indoor camera|true         |
|AACCCA    |YY    |indoor camera|true         |
|A121AA    |AA    |indoor camera|true         |
|BBB       |MNMN  |indoor camera|null         |
|CCC       |MNMN  |indoor camera|null         |
|DDD       |BBBNNN|indoor camera|null         |
+----------+------+-------------+-------------+

我想根据“产品”加入并获取加入的数据。如果“名称”在 A 中,那么最终连接的数据应该具有来自 A 的标题(仅例如 WW),并从 B 获得休息。我不确定我需要什么样的连接。有人可以建议我任何想法吗?

【问题讨论】:

    标签: sql scala apache-spark dataframe join


    【解决方案1】:

    使用完全连接

    a.join(b, ['title'], how='full').show()
    

    或者合并两个表列

    import pyspark.sql.functions as F
    a.join(b, a.title == b.title , how='full').select(
        F.coalesce(a.title , b.title ).alias('title'), a.name , a.product,a.available
    ).show()
    

    【讨论】:

    • 这里有点困惑。我认为合并是重新分区。我错了吗 ?小心解释你的逻辑
    • coalesce 不用于分区,它的工作方式就像如果列值为空,那么它将考虑第二个。因此,当您完全加入标题时,您会发现不匹配的行,届时它将考虑两个表的两个值@user3407267
    • 但它没有删除其他行
    • "true" 对于所有值
    • @user3407267,您现在可以查看
    【解决方案2】:

    只是想看看我是否正确理解了这一点。 您想加入 Product、name 和 title 的框架,但只保留数据存在于 A 中的那些。 如果是这样,你可以试试:

    a.join(b, on=['product', 'name', 'title'], how='left').show()

    【讨论】:

    • 但我也需要从 B 获取其他数据。请参阅示例。
    • 这样做你会得到 B 中的所有数据,其中在 A 中有对应的匹配 ['product', 'name', 'title']。你唯一没有得到的是A中没有条目,
    猜你喜欢
    • 2015-09-02
    • 2019-01-30
    • 1970-01-01
    • 2019-05-02
    • 2020-04-29
    • 2020-12-23
    • 2021-06-23
    • 1970-01-01
    • 2020-10-28
    相关资源
    最近更新 更多