火花多条件加入

Posted

技术标签:

【中文标题】火花多条件加入【英文标题】:Spark Multiple Conditions Join 【发布时间】:2016-05-25 21:40:40 【问题描述】:

我正在使用 spark sql 连接三个表,但是出现多列条件时出现错误。

test_table = (T1.join(T2,T1.dtm == T2.kids_dtm, "inner")
          .join(T3, T3.kids_dtm == T1.dtm
                and T2.room_id == T3.room_id
                and T2.book_id == T3.book_id, "inner"))

错误:

  Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
  File "/opt/cloudera/parcels/CDH-5.7.0-1.cdh5.7.0.p0.45/lib/spark/python/pyspark/sql/column.py", line 447, in __nonzero__
    raise ValueError("Cannot convert column into bool: please use '&' for 'and', '|' for 'or', "
ValueError: Cannot convert column into bool: please use '&' for 'and', '|' for 'or', '~' for 'not' when building DataFrame boolean expressions.

我没有指定“and”,而是尝试输入“&”和“&&”,但这些都不起作用。任何帮助,将不胜感激。

【问题讨论】:

【参考方案1】:

Nvm,以下使用“&”和括号:

test_table = (T1.join(T2,T1.dtm == T2.kids_dtm, "inner")
      .join(T3, (T3.kids_dtm == T1.dtm)
            & (T2.room_id == T3.room_id)
            & (T2.book_id == T3.book_id), "inner"))

【讨论】:

或者你可以把你的条件放在一个列表中;有关示例,请参见 ***.com/a/34463562/1843329。 用 OR 代替呢? X 或 Y,它在列表中如何工作? 或者您可以使用带有变量名称的条件列表,例如***.com/a/45813075/38368,如果计算列名称,这很有用,例如通过循环中的索引。

以上是关于火花多条件加入的主要内容,如果未能解决你的问题,请参考以下文章

如何退出火花程序

火花中的条件

如果满足任何(不是全部)条件,如何执行火花连接

如何在火花的过滤条件中使用NOT IN子句

在火花作业scala中添加新列之前检查空条件[重复]

根据scala中的条件对列进行火花数据框聚合