繁体   English   中英

Spark DataFrame 中的条件连接

[英]Conditional Join in Spark DataFrame

我正在尝试加入两个DataFrame

我有两个数据框 A 和 B。

A 包含 id,m_cd 和 c_cd 列 B 包含 m_cd,c_cd 和 record 列

条件是——

  • 如果 m_cd 为空,则将 A 的 c_cd 与 B 连接
  • 如果 m_cd 不为空,则将 A 的 m_cd 与 B 连接

我们可以在withcolumn () 方法中使用“ when ”和“ otherwise ()”,那么对于加入数据帧的情况有什么方法可以做到这一点。

我已经使用Union完成了此操作。但想知道是否还有其他选项可用。

您可以在连接条件中使用“when”/“otherwise”:

case class Foo(m_cd: Option[Int], c_cd: Option[Int])
val dfA = spark.createDataset(Array(
    Foo(Some(1), Some(2)),
    Foo(Some(2), Some(3)),
    Foo(None: Option[Int], Some(4))
))


val dfB = spark.createDataset(Array(
    Foo(Some(1), Some(5)),
    Foo(Some(2), Some(6)),
    Foo(Some(10), Some(4))
))

val joinCondition = when($"a.m_cd".isNull, $"a.c_cd"===$"b.c_cd")
    .otherwise($"a.m_cd"===$"b.m_cd")

dfA.as('a).join(dfB.as('b), joinCondition).show

但是,使用联合可能仍然更具可读性。

如果有人试图在 Pyspark 中做到这一点,这里是 sintaxe

join_condition = when(df1.azure_resourcegroup.startswith('a_string'),df1.some_field == df2.somefield)\
    .otherwise((df1.servicename == df2.type) &
    (df1.resourcegroup == df2.esource_group) &
    (df1.subscriptionguid == df2.subscription_id))
df1 = df1.join(df2,join_condition,how='left')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM