使用多列作为存储在 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(_ &amp;&amp; _) 使用多列连接的最佳方式。 @zero323 请补充一点,如果有人想要在两个输入均为 NULL 时返回 true(而不是 NULL),则 === 必须替换为 (EqualNullSafe)

以上是关于使用多列作为存储在 Apache Spark 中的数组中的键来连接两个 Dataframe的主要内容,如果未能解决你的问题,请参考以下文章

Apache-Spark 作为日志存储

使用spark对hive表中的多列数据判重

使用 Apache Spark Notebook 覆盖 Bluemix 对象存储中的 Parquet 文件

Apache Spark 数据框列爆炸为多列

从 Spark DataFrame 中的单列派生多列

Apache Spark Dataframe Groupby agg() 用于多列