使用多列作为存储在 Apache Spark 中的数组中的键来连接两个 Dataframe
Posted
技术标签:
【中文标题】使用多列作为存储在 Apache Spark 中的数组中的键来连接两个 Dataframe【英文标题】:Join of two Dataframes using multiple columns as keys stored in an Array in Apache Spark 【发布时间】:2016-02-02 09:57:28 【问题描述】:如何使用多列作为键来计算两个数据框的连接?例如 DF1 , DF2 是两个dataFrame。
这是我们可以计算连接的方式,
JoinDF = DF1.join(DF2, DF1("column1") === DF2("column11") && DF1("column2") === DF2("column22"), "outer")
但我的问题是如何访问多个列,如果它们存储在数组中,例如:
DF1KeyArray=Arraycolumn1,column2
DF2KeyArray=Arraycolumn11,column22
那么这个方法是无法计算join的
JoinDF = DF1.join(DF2, DF1(DF1KeyArray)=== DF2(DF2KeyArray), "outer")
在这种情况下,错误是:
<console>:128: error: type mismatch;
found : Array[String]
required: String
有什么方法可以访问多个列作为存储在数组中的键以计算连接?
【问题讨论】:
请格式化您的问题!这是不可读的。也添加编程语言标签! @eliasah Scala 是编程语言。 【参考方案1】:您可以简单地以编程方式创建joinExprs
:
val df1KeyArray: Array[String] = ???
val df2KeyArray: Array[String] = ???
val df1: DataFrame = ???
val df2: DataFrame = ???
val joinExprs = df1KeyArray
.zip(df2KeyArray)
.mapcase (c1, c2) => df1(c1) === df2(c2)
.reduce(_ && _)
df1.join(df2, joinExprs, "outer")
另见Including null values in an Apache Spark Join
【讨论】:
很好地使用.reduce(_ && _)
使用多列连接的最佳方式。 @zero323 请补充一点,如果有人想要在两个输入均为 NULL 时返回 true(而不是 NULL),则 === 必须替换为 (EqualNullSafe)以上是关于使用多列作为存储在 Apache Spark 中的数组中的键来连接两个 Dataframe的主要内容,如果未能解决你的问题,请参考以下文章